【发布时间】:2011-03-18 11:01:10
【问题描述】:
谁能指出一个教程,向我展示如何使用 urllib2 进行 POST 请求,数据为 JSON 格式?
【问题讨论】:
谁能指出一个教程,向我展示如何使用 urllib2 进行 POST 请求,数据为 JSON 格式?
【问题讨论】:
Messa 的答案仅在服务器不费心检查内容类型标头时才有效。如果您希望它真正起作用,您需要指定一个内容类型标题。这是 Messa 的答案修改为包含内容类型标题:
import json
import urllib2
data = json.dumps([1, 2, 3])
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
【讨论】:
data = json.dumps([1, 2, 3]).encode("utf8)。见stackoverflow.com/a/5441022/3757139
data = urllib.parse.urlencode(data)?
无论 urllib 使用什么来计算 Content-Length 似乎都被 json 混淆了,所以你必须自己计算。
import json
import urllib2
data = json.dumps([1, 2, 3])
clen = len(data)
req = urllib2.Request(url, data, {'Content-Type': 'application/json', 'Content-Length': clen})
f = urllib2.urlopen(req)
response = f.read()
f.close()
我花了很长时间才弄清楚这一点,所以我希望它对其他人有所帮助。
【讨论】:
示例 - 将一些编码为 JSON 的数据作为 POST 数据发送:
import json
import urllib2
data = json.dumps([1, 2, 3])
f = urllib2.urlopen(url, data)
response = f.read()
f.close()
【讨论】:
要读取 json 响应,请使用 json.loads()。这是示例。
import json
import urllib
import urllib2
post_params = {
'foo' : bar
}
params = urllib.urlencode(post_params)
response = urllib2.urlopen(url, params)
json_response = json.loads(response.read())
【讨论】:
您当然想破解标头以获得正确的 Ajax 请求:
headers = {'X_REQUESTED_WITH' :'XMLHttpRequest',
'ACCEPT': 'application/json, text/javascript, */*; q=0.01',}
request = urllib2.Request(path, data, headers)
response = urllib2.urlopen(request).read()
然后到 json.loads 服务器端的 POST。
编辑:顺便说一句,您必须在发送之前urllib.urlencode(mydata_dict)。如果你不这样做,POST 将不会是服务器所期望的
【讨论】:
这对我有用:
import json
import requests
url = 'http://xxx.com'
payload = {'param': '1', 'data': '2', 'field': '4'}
headers = {'content-type': 'application/json'}
r = requests.post(url, data = json.dumps(payload), headers = headers)
【讨论】: