我从2天开始挣扎,只使用urllib &urllib2。在使用curl或requests库时,我有一些限制,因为我需要部署代码的机器不支持这些。
post调用将伴随着Header和json Body。我能够使任何get调用,但POST与数据& &;报头抛出400个错误请求。尝试并应用了所有可用的选项在谷歌/stackoverflow,但没有解决!
下面是示例代码:——import urllib
import urllib2
url = 'https://1.2.3.4/rest/v1/path'
headers = {'X-Auth-Token': '123456789sksksksk111',
'Content-Type': 'application/json'}
body = {'Action': 'myaction',
'PressType': 'Format1', 'Target': '/abc/def'}
data = urllib.urlencode(body)
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request, data)
在设置调试处理程序时,下面是可以跟踪的请求格式:——
send: 'POST /rest/v1/path HTTP/1.1rnAccept-Encoding: identityrnContent-Length: 52rnHost: 1.2.3.4rnUser-Agent: Python-urllib/2.7rnConnection: closernX-Auth-Token: 123456789sksksksk111rnContent-Type: application/jsonrnrnAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef'
reply: 'HTTP/1.1 400 Bad Requestrn'
请注意,相同的post请求在任何REST客户端和Requests库中都可以很好地工作。在调试处理程序输出中,如果我们看到json结构是Content-Type: application/jsonrnrnAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef
,这可能有问题!
你可以转储json而不是编码它。我也面临着同样的问题,并解决了它!
去除data = urllib.urlencode(body)
,使用urllib2.urlopen(req, json.dumps(data))