2013-11-15 1 views
2

Python 2.7의 urllib2 모듈을 통해 put 요청을하려고합니다. GET을 수행하면 정상적으로 작동하지만 PUT으로 변환하려고하면 301 http 오류가 반환됩니다. 내 위의 코드입니다 : 내가 선Python : urllib2 put request가 301 오류를 반환합니다.

req.get_method = lambda: 'PUT' 

작동하지만 (나는 일부 데이터를 전달하는 경우 또는 포스트)는 GET 요청의를 억제하면

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) 

하지만이 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 요청을 처리 할 수 ​​있도록 (아주 깨끗하지만 만약 어떤 확실하지)에 직접 핸들러를 변경 : 요청이나 POST를 GET 어느 쪽도 없을 때 실제로

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

를, 자동으로 일으키 신 오류. 같은 문제가있는 다른 사람을 찾을 수 없다는 것에 놀랐습니다.