【问题标题】:How do I pass raw POST data into urllib3?如何将原始 POST 数据传递到 urllib3?
【发布时间】:2013-10-07 19:29:41
【问题描述】:

尝试使用 urllib3 发布 JSON 编码的数据。 只希望我的 POST 有效负载是原始 JSON 字符串,内容类型为 application/json。 我只是看不到如何做到这一点。

urllib3 文档描述了在“字段”中发布数据,即带有 (key,value) 对的字典,例如 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)

感谢您的指点!

【问题讨论】:

  • 使用 Python 的 requests 模块..
  • @user2799617:requests 模块提供了一个方便,但是很窄的接口over urllib3,对于一些任务,比如异步编程,使用requests是不实用的,但是使用urllib3 暴露的更明确的接口是相当可行的。无论如何,urllib3 比任何内置的 Python 库(httplib 或 urllib/urllib2)都方便得多。

标签: python post urllib3


【解决方案1】:

你不能用PoolManager.request那个,它会自己炮制身体,用低级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"
  }
}

【讨论】:

  • ^- 这是正确的。 RequestMethods.request_encode_body(...) 对于 op 来说有点太高级了,因为它会尝试为您编码字段 dict-like 参数。较低级别的 pool.urlopen(..., body=payload) 正是 op 想要的。现在阅读文档,我可以看到这并不明显。带有改进文档的拉取请求会很可爱。 :)
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2018-06-18
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多