urllib2를 사용하여 GET 대신 POST 호출 만들기
urllib2 및 POST 호출에 많은 내용이 있지만 문제가 있습니다.
서비스에 대한 간단한 POST 호출을 시도하고 있습니다.
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
content = urllib2.urlopen(url=url, data=data).read()
print content
서버 로그를 볼 수 있으며 데이터 인수를 urlopen에 보낼 때 GET 호출을 수행하고 있다고 말합니다.
라이브러리에서 404 오류 (찾을 수 없음)가 발생하는데, 이는 GET 호출에 대해 정확하고 POST 호출이 잘 처리됩니다 (HTML 양식 내에서 POST로 시도하고 있음).
이것은 이전에 대답했을 수 있습니다 : Python URLLib / URLLib2 POST .
서버가에서 http://myserver/post_service
로 302 리디렉션을 수행하고있을 가능성이 높습니다 http://myserver/post_service/
. 302 리디렉션이 수행되면 요청이 POST에서 GET으로 변경됩니다 ( 문제 1401 참조 ). 변경 시도 url
에 http://myserver/post_service/
.
단계적으로 수행하고 다음과 같이 개체를 수정합니다.
# make a string with the request type in it:
method = "POST"
# create a handler. you can specify different handlers here (file uploads etc)
# but we go for the default
handler = urllib2.HTTPHandler()
# create an openerdirector instance
opener = urllib2.build_opener(handler)
# build a request
data = urllib.urlencode(dictionary_of_POST_fields_or_None)
request = urllib2.Request(url, data=data)
# add any other information you want
request.add_header("Content-Type",'application/json')
# overload the get method function with a small anonymous function...
request.get_method = lambda: method
# try it; don't forget to catch the result
try:
connection = opener.open(request)
except urllib2.HTTPError,e:
connection = e
# check. Substitute with appropriate HTTP code.
if connection.code == 200:
data = connection.read()
else:
# handle the error case. connection.read() will still contain data
# if any was returned, but it probably won't be of any use
이 방법은 당신이 결정을 확장 할 수 있습니다 PUT
, DELETE
, HEAD
그리고 OPTIONS
단순히 기능에 그것을 포장도 방법의 값을 대체하거나하여도 요청. 수행하려는 작업에 따라 다중 파일 업로드와 같은 다른 HTTP 처리기가 필요할 수도 있습니다.
요청 모듈은 고통을 완화 할 수있다.
url = 'http://myserver/post_service'
data = dict(name='joe', age='10')
r = requests.post(url, data=data, allow_redirects=True)
print r.content
urllib Missing Manual을 읽어보십시오 . 여기에서 가져온 POST 요청의 다음과 같은 간단한 예가 있습니다.
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe', 'age' : '10'})
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
print response.read()
@Michael Kent가 제안한대로 요청을 고려 하는 것이 좋습니다.
EDIT: This said, I do not know why passing data to urlopen() does not result in a POST request; It should. I suspect your server is redirecting, or misbehaving.
it should be sending a POST if you provide a data parameter (like you are doing):
from the docs: "the HTTP request will be a POST instead of a GET when the data parameter is provided"
so.. add some debug output to see what's up from the client side.
you can modify your code to this and try again:
import urllib
import urllib2
url = 'http://myserver/post_service'
opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
content = opener.open(url, data=data).read()
Try this instead:
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
req = urllib2.Request(url=url,data=data)
content = urllib2.urlopen(req).read()
print content
url="https://myserver/post_service"
data["name"] = "joe"
data["age"] = "20"
data_encoded = urllib2.urlencode(data)
print urllib2.urlopen(url + "?" + data_encoded).read()
May be this can help
ReferenceURL : https://stackoverflow.com/questions/6348499/making-a-post-call-instead-of-get-using-urllib2
'programing' 카테고리의 다른 글
IntelliJ IDEA 글로벌 검색 (0) | 2021.01.11 |
---|---|
로그인 실패 후 리디렉션 고안 (0) | 2021.01.11 |
.gitignore는 모든 파일을 무시하고 * .foo를 재귀 적으로 허용합니다. (0) | 2021.01.11 |
아무것도 반환되지 않을 때 JSON 디코딩 오류 처리 (0) | 2021.01.11 |
감독 된 하위 프로세스 중지 (0) | 2021.01.11 |