programing

urllib2를 사용하여 GET 대신 POST 호출 만들기

nasanasas 2021. 1. 11. 08:19
반응형

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_service302 리디렉션을 수행하고있을 가능성이 높습니다 http://myserver/post_service/. 302 리디렉션이 수행되면 요청이 POST에서 GET으로 변경됩니다 ( 문제 1401 참조 ). 변경 시도 urlhttp://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

반응형