POST 的 urllib2 的 400 错误请求

400 Bad Request With urllib2 for POST

从 2 天开始,我一直在努力处理 post 仅使用 urllib 和 urllib2 发出的请求。我在使用 curl 或请求库时有限制,因为我需要部署我的代码的机器不支持任何这些。

post 调用将伴随一个 Header 和 json Body。我可以进行任何 get 调用,但是 POST with Data & Header 抛出 400 个错误请求。尝试并应用了 google/Whosebug 中可用的所有选项,但没有解决任何问题!

下面是示例代码:--

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.1\r\nAccept-Encoding: identity\r\nContent-Length: 52\r\nHost: 1.2.3.4\r\nUser-Agent: Python-urllib/2.7\r\nConnection: close\r\nX-Auth-Token: 123456789sksksksk111\r\nContent-Type: application/json\r\n\r\nAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef'

reply: 'HTTP/1.1 400 Bad Request\r\n'

请注意,相同的 post 请求在任何 REST 客户端和 Requests 库中都可以正常工作。在调试处理程序输出中,如果我们看到 json 结构是 Content-Type: application/json\r\n\r\nAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef,这会不会是一个问题!

您可以转储 json 而不是对其进行编码。我遇到了同样的问题并得到了解决!

删除 data = urllib.urlencode(body) 并使用 urllib2.urlopen(req, json.dumps(data))

应该可以解决。