Python:urllib2 put请求返回301错误

时间:2013-11-15 10:21:55

标签: python-2.7 urllib2 http-status-code-301 put

我正在尝试通过Python 2.7的urllib2模块发出一个put请求。当我执行GET时它工作得很好但是当我尝试将它变成PUT时它会返回301 http错误。 我的代码在上面:

opener = urllib2.build_opener(urllib2.HTTPHandler)
req = urllib2.Request(reqUrl)
base64string = base64.encodestring('%s:%s' % (v_username, v_password)).replace('\n', '')
req.add_header("Authorization", "Basic %s" % base64string)
req.add_header("Content-Type", "application/rdf+xml")
req.add_header("Accept", "application/rdf+xml")
req.add_header("OSLC-Core-Version", "2.0")
req.get_method = lambda: 'PUT'
req.allow_redirects=True
url = opener.open(req)

如果我压制线

req.get_method = lambda: 'PUT'

它可以工作,但它是一个获取请求(或者如果我传递一些数据的帖子),但它必须是PUT而我不知道如何以不同的方式使用此模块。

错误是

urllib2.HTTPError: HTTP Error 301: Moved Permanently.

有谁比我更了解这一点?我是REST请求的新手,有些特殊性对我来说仍然模糊不清。

2 个答案:

答案 0 :(得分:2)

我不确定,但可能是urllib为GET自动处理301而不是PUT吗?根据{{​​3}},用户代理可以自动重定向GET,但不能重定向PUT。

RFC似乎暗示urllib确实自动处理301重定向,并且看起来似乎有理由它不会自动处理给定RFC的PUT重定向。猜猜你应该找出重定向的内容并重定向。

答案 1 :(得分:0)

谢谢你,你帮我理解了这个问题。我直接在urllib2.py文件中更改了处理程序(不确定它是否非常干净但是无论如何)所以它可以处理PUT请求:

if (code in (301, 302, 303, 307) and m in ("GET", "HEAD")
            or code in (301, 302, 303) and m in ("POST", "PUT")):

实际上,当请求既不是GET也不是POST时,它会自动引发错误。我很惊讶我找不到其他人有同样的问题。