2013-11-15 41 views
2

我试图通过Python 2.7的urllib2模块进行放置请求。当我执行GET时,它工作得很好,但是当我尝试将它变成PUT时,它返回301 http错误。 我的代码是上面:Python:urllib2放置请求返回301错误

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' 

它的工作原理,但它是一个GET请求(或一个职位,如果我通过一些数据),但它必须是一个PUT和我不怎么用这个模块做不同的事情。

的错误是

urllib2.HTTPError: HTTP Error 301: Moved Permanently. 

有谁明白这一点比我还多?我是一个REST请求的新手,对我来说有一些特殊的含义。

回答

2

我不确定,但它可能是urllib处理301自动为GET但不是为PUT?根据RFC,用户代理可以自动重定向GET,但不是PUT。

This page似乎暗示urllib确实会自动处理301重定向,并且它看起来似乎合理,它不会自动处理给定RFC的PUT重定向。猜猜你应该找出重定向是什么,并在那里重定向。

0

谢谢Ken F,你帮我理解了这个问题。我直接在urllib2.py文件(不知道这是很干净,但不管),所以它可以处理PUT请求更改处理程序:当请求既不是GET也不POST

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

事实上,它会自动的升起错误。我很惊讶,我找不到有其他问题的人。