Преобразуйте вихревой запрос POST в Python, только пользующийся стандартной библиотекой

Я хотел бы преобразовать эту вихревую команду во что-то, что я могу использовать в Python для существующего сценария.

curl -u 7898678:X -H 'Content-Type: application/json' \
-d '{"message":{"body":"TEXT"}}' http://sample.com/36576/speak.json

ТЕКСТ - то, что я хотел бы заменить сообщением, сгенерированным остальной частью сценария. (Который уже работает разумный, хотя я не думаю, что это применяет лучшие методы или надежную особенность. - потребность узнать, как правильно учиться программировать (т.е. не использовать Google для сборки материала)),

Я хотел бы, чтобы это работало со стандартной библиотекой, если это возможно.

20
задан Cœur 9 January 2017 в 13:32
поделиться

4 ответа

Хотя существуют способы обработки аутентификации в urllib2, если вы выполняете Базовую Авторизацию (что означает эффективную отправку имени пользователя и пароля в чистом тексте), то с urllib2 вы можете делать все, что захотите. Request и urllib2.urlopen:

import urllib2

def basic_authorization(user, password):
    s = user + ":" + password
    return "Basic " + s.encode("base64").rstrip()

req = urllib2.Request("http://localhost:8000/36576/speak.json",
                      headers = {
        "Authorization": basic_authorization("7898678", "X"),
        "Content-Type": "application/json",

        # Some extra headers for fun
        "Accept": "*/*",   # curl does this
        "User-Agent": "my-python-app/1", # otherwise it uses "Python-urllib/..."
        },
                      data = '{"message":{"body":"TEXT"}}')

f = urllib2.urlopen(req)

Я протестировал это с помощью netcat, так что я увидел, что отправленные данные, за исключением порядка сортировки, идентичны в обоих случаях. Здесь первый был сделан с помощью curl, а второй - с помощью urllib2

% nc -l 8000
POST /36576/speak.json HTTP/1.1
Authorization: Basic Nzg5ODY3ODpY
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: localhost:8000
Accept: */*
Content-Type: application/json
Content-Length: 27

{"message":{"body":"TEXT"}} ^C

% nc -l 8000
POST /36576/speak.json HTTP/1.1
Accept-Encoding: identity
Content-Length: 27
Connection: close
Accept: */*
User-Agent: my-python-app/1
Host: localhost:8000
Content-Type: application/json
Authorization: Nzg5ODY3ODpY

{"message":{"body":"TEXT"}}^C

(Это слегка подстроено на выходе. В моем тестовом примере не использовался тот же путь url, что и у вас.)

Нет необходимости использовать лежащий в основе httplib, который не поддерживает то, что urllib2 дает вам, как прокси-сервер. С другой стороны, я нахожу urllib2 сложным вне этого простого вида запроса, и если вы хотите лучшей поддержки, для каких заголовков и какого порядка они посылаются, тогда используйте httplib.

.
12
ответ дан 30 November 2019 в 00:01
поделиться

Взгляните на pycurl http://pycurl.sourceforge.net/

1
ответ дан 30 November 2019 в 00:01
поделиться

Спасибо каждому

этому произведению

import urllib2

def speak(status):

    def basic_authorization(user, password):
        s = user + ":" + password
        return "Basic " + s.encode("base64").rstrip()

    req = urllib2.Request("http://example.com/60/speak.json",
                  headers = {
       "Authorization": basic_authorization("2345670", "X"),
     "Content-Type": "application/json",


        "Accept": "*/*",   
        "User-Agent": "my-python-app/1", 
        },
                      data = '{"message":{"body":'+ status +'}}')

    f = urllib2.urlopen(req)


speak('Yay')
2
ответ дан 30 November 2019 в 00:01
поделиться

Мне бы хотелось бы работать со стандартной библиотекой, если это возможно.

Стандартная библиотека обеспечивает URLLIB и httplib для работы с URL-адресами:

>>> import httplib, urllib
>>> params = urllib.urlencode({'apple': 1, 'banana': 2, 'coconut': 'yummy'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("example.com:80")
>>> conn.request("POST", "/some/path/to/site", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200 OK

Если вы хотите выполнить Curl , хотя, вы можете просто вызвать OS.System () :

import os
TEXT = ...
cmd = """curl -u 7898678:X -H 'Content-Type: application/json'""" \
  """-d '{"message":{"body":"%{t}"}}' http://sample.com/36576/speak.json""" % \
  {'t': TEXT}

Если вы готовы отдохнуть ограничение только в библиотеке стандартов, вы можете использовать Pycurl . Остерегайтесь, что это не очень Pythonic (это в значительной степени просто тонкий шпон над libcurl), и я не уверен, насколько это совместим с Python 3.

23
ответ дан 30 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: