400错误请求使用urllib2进行POST

时间:2016-08-11 07:16:04

标签: python rest http-post urllib2 urllib

我正在努力工作2天,只有使用urllib& urllib2的。我在使用curl或请求库时有局限性,因为我需要部署代码的机器不支持任何这些。

电话会议将伴随一个Header和json Body。我可以拨打任何电话,但是使用Data& amp;标题会抛出400个不良请求。尝试并应用了google / 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.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'

请注意,相同的帖子请求适用于任何REST客户端和Requests库。在调试处理程序输出中,如果我们看到,json结构是Content-Type:application/json\r\n\r\nAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef,那可能是个问题!

1 个答案:

答案 0 :(得分:1)

您可以转储json而不是对其进行编码。我面对同样的事情并且用它解决了!

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

那应该解决。