我正在尝试通过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请求的新手,有些特殊性对我来说仍然模糊不清。
答案 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时,它会自动引发错误。我很惊讶我找不到其他人有同样的问题。