2013-10-07 3 views
4

Пытается использовать urllib3 для отправки JSON-кодированных данных. Просто хочу, чтобы моя полезная нагрузка POST была необработанной строкой JSON с приложением типа контента/json. Я просто не вижу, как это сделать.Как передать необработанные данные POST в urllib3?

Документация по urllib3 описывает размещение данных в «полях», то есть определяет пары (ключ, значение), например, как HTML-формы кодируются URL-адресом с URL-адресом. Но я не хочу этого делать.

Ближайший я был в состоянии получить это (я только догадывался, куда поместить данные, как это нигде не документировано, что я могу найти):

http = urllib3.PoolManager() 
headers = urllib3.util.make_headers(basic_auth=key+":") 
r = http.request_encode_body('POST', path, json.dumps(payload), headers=headers) 

, который вызывает эту ошибку urllib3:

File "C:\Python27\lib\site-packages\urllib3-1.7.1-py2.7.egg\urllib3\filepost.py", line 44, in iter_field_objects 
yield RequestField.from_tuples(*field) 
TypeError: from_tuples() takes exactly 3 arguments (2 given) 

Спасибо за любые указатели!

+1

Используйте модуль запросов для Python .. –

+3

@ user2799617: модуль запросов обеспечивает удобный, но очень узкий интерфейс * поверх * 'urllib3', для некоторых задач, таких как асинхронное программирование, использование запросов нецелесообразно, но использование более явного интерфейса, открытого urllib3, вполне выполнимо. в любом случае 'urllib3' гораздо удобнее любой из встроенных библиотек python (httplib или urllib/urllib2). – SingleNegationElimination

ответ

5

вы не можете использовать PoolManager.request для этого, он пытается состряпать тело iself, используйте нижний уровень urlopen:

In [16]: pool = urllib3.PoolManager() 

In [17]: print pool.urlopen('POST', 'http://httpbin.org/post', headers={'Content-Type':'application/json'}, body='{"sup":"son"}').data 
{ 
    "data": "{\"sup\":\"son\"}", 
    "form": {}, 
    "json": { 
    "sup": "son" 
    }, 
    "origin": "50.74.23.243", 
    "args": {}, 
    "url": "http://httpbin.org/post", 
    "files": {}, 
    "headers": { 
    "Host": "httpbin.org", 
    "Content-Length": "13", 
    "Content-Type": "application/json", 
    "Accept-Encoding": "identity", 
    "Connection": "close" 
    } 
} 
+1

^- Это правильно. [RequestMethods.request_encode_body (...)] (http://urllib3.readthedocs.org/en/latest/helpers.html#urllib3.request.RequestMethods.request_encode_body) немного слишком высокого уровня для op, поскольку он будет пытаться кодировать полевой диктофонный параметр для вас. Низкий уровень 'pool.urlopen (..., body = payload)' именно то, что хочет. Теперь, читая документы, я вижу, что это не очевидно, что это то, что происходит. Запрос на растяжение с улучшенными документами будет прекрасным. :) – shazow

Смежные вопросы