【问题标题】:400 Bad Request With urllib2 for POST使用 urllib2 进行 POST 的 400 错误请求
【发布时间】:2016-08-11 07:16:04
【问题描述】:

我从 2 天开始就只使用 urllib 和 urllib2 进行发布请求。我在使用 curl 或 requests 库时受到限制,因为我需要部署我的代码的机器不支持其中任何一个。

post 调用会附带一个 Header 和 json Body。我可以拨打任何电话,但带有数据和标题的 POST 会引发 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,这可能是个问题!

【问题讨论】:

  • 你是特别想使用 urllib 还是我也应该使用 request 模块?
  • @akashkarothiya:- 引用问题:- “我在使用 curl 或 requests 库方面有限制”:)

标签: python rest http-post urllib2 urllib


【解决方案1】:

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

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

这应该可以解决。

【讨论】:

  • 非常感谢。它至少解决了格式 400 错误请求问题。 :)
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多