2013-11-15 42 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")): 

事實上,它會自動的升起錯誤。我很驚訝,我找不到有其他問題的人。