Python의 단순 URL GET / POST 함수


80

Google에는 보이지 않지만 다음과 같은 기능을 원합니다.

3 개의 인수 (또는 그 이상)를 수락합니다.

  • URL
  • 매개 변수 사전
  • POST 또는 GET

결과와 응답 코드를 돌려주세요.

이 작업을 수행하는 스 니펫이 있습니까?


질문은 명확하지 않습니다. 이것은 로컬 URL을위한 것입니다. 서버 또는 원격 URL을 작성하고 있습니다. 당신은 클라이언트를 쓰고 있습니까?
Charles Duffy

더 많은 문제를 사용하세요. 나중에 설명적인 제목을 사용하세요.
Kissaki 2010

답변:


111

요청

https://github.com/kennethreitz/requests/

이를 사용하는 몇 가지 일반적인 방법은 다음과 같습니다.

import requests
url = 'https://...'
payload = {'key1': 'value1', 'key2': 'value2'}

# GET
r = requests.get(url)

# GET with params in URL
r = requests.get(url, params=payload)

# POST with form-encoded data
r = requests.post(url, data=payload)

# POST with JSON 
import json
r = requests.post(url, data=json.dumps(payload))

# Response, status etc
r.text
r.status_code

httplib2

https://github.com/jcgregorio/httplib2

>>> from httplib2 import Http
>>> from urllib import urlencode
>>> h = Http()
>>> data = dict(name="Joe", comment="A test comment")
>>> resp, content = h.request("http://bitworking.org/news/223/Meet-Ares", "POST", urlencode(data))
>>> resp
{'status': '200', 'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding,User-Agent',
 'server': 'Apache', 'connection': 'close', 'date': 'Tue, 31 Jul 2007 15:29:52 GMT', 
 'content-type': 'text/html'}

당신은 또한 사용할 수 있습니다from httplib2 import Http as h
3k-

3
3K 아니 @, 그는 인스턴스화있어 Http그것을 앨리어싱하지, 클래스 : h = Http()하지 h = Http.
ecstaticpeon 2014

@ecstaticpeon 당신이 매우 옳습니다, 나는 매우 피곤했을 것입니다. 수정 해주셔서 감사합니다!
3k- 2014

타사 라이브러리없이 기본 방식으로이 작업을 수행하면 좋을 것입니다.
사용자

52

더 쉽게 : 요청 모듈을 통해 .

import requests
get_response = requests.get(url='http://google.com')
post_data = {'username':'joeb', 'password':'foobar'}
# POST some form-encoded data:
post_response = requests.post(url='http://httpbin.org/post', data=post_data)

양식 인코딩되지 않은 데이터를 보내려면 문자열로 직렬화하여 보내십시오 ( 문서 에서 가져온 예 ).

import json
post_response = requests.post(url='http://httpbin.org/post', data=json.dumps(post_data))
# If using requests v2.4.2 or later, pass the dict via the json parameter and it will be encoded directly:
post_response = requests.post(url='http://httpbin.org/post', json=post_data)

3
나는 그것이 나를 위해 일하기 전에 json.dumps ()에 post_data를 래핑해야했다 :data=json.dumps(post_data)
Matt

1
@Matt, 이것은 양식으로 인코딩 된 데이터 (사전에 전달)를 제출할지 또는 양식으로 인코딩되지 않은 데이터 (JSON 데이터 문자열로 전달)를 제출할지 여부에 따라 달라진다고 생각합니다. 여기에서 문서를 참조합니다 : docs.python-requests.org/en/latest/user/quickstart/…
ropable

이 모듈의 Windows 용 버전이 있습니까?
TheGoodUser 2014 년

@TheGoodUser이 라이브러리 (및 더 많은 것)는 Windows 용으로 컴파일되어 있으며 여기에서 사용할 수 있습니다. lfd.uci.edu/~gohlke/pythonlibs/#requests
2014 년

33

이것을 사용하여 urllib2를 래핑 할 수 있습니다.

def URLRequest(url, params, method="GET"):
    if method == "POST":
        return urllib2.Request(url, data=urllib.urlencode(params))
    else:
        return urllib2.Request(url + "?" + urllib.urlencode(params))

결과 데이터와 응답 코드가 있는 Request 객체를 반환합니다 .


11
나는 표준 라이브러리를 고수하기 위해 이것을 선호합니다.
Charles Duffy

URL + "?"이어야합니다. URL + '&'대신?
Paulo Scardine 2010

1
이것은 멋지지만 정확히 말하면 Request객체 자체에는 결과 데이터 나 응답 코드가 없습니다 urlopen. 같은 메서드를 통해 "요청"되어야 합니다.
Bach

@Bach 여기에 URLRequest 메소드를 사용하여 urlopen과 같은 "요청 된"부분을 수행하는 코드의 예가 있습니까? 어디에서도 찾을 수 없습니다.
theJerm dec

@theJerm, 나는 그것을 참조했습니다. 시도 r = urllib2.urlopen(url)r.readlines()및 / 또는 r.getcode(). 대신 요청 사용을 고려할 수도 있습니다 .
Bach

10
import urllib

def fetch_thing(url, params, method):
    params = urllib.urlencode(params)
    if method=='POST':
        f = urllib.urlopen(url, params)
    else:
        f = urllib.urlopen(url+'?'+params)
    return (f.read(), f.code)


content, response_code = fetch_thing(
                              'http://google.com/', 
                              {'spam': 1, 'eggs': 2, 'bacon': 0}, 
                              'GET'
                         )

[최신 정보]

이 답변 중 일부는 오래되었습니다. 오늘 requests은 robaple의 답변처럼 모듈 을 사용 하겠습니다.


9

나는 당신이 GET과 POST를 요청했지만 다른 사람들이 이것을 필요로 할 수 있기 때문에 CRUD를 제공 할 것입니다. (이것은 Python 3.7 에서 테스트되었습니다 )

#!/usr/bin/env python3
import http.client
import json

print("\n GET example")
conn = http.client.HTTPSConnection("httpbin.org")
conn.request("GET", "/get")
response = conn.getresponse()
data = response.read().decode('utf-8')
print(response.status, response.reason)
print(data)


print("\n POST example")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body = {'text': 'testing post'}
json_data = json.dumps(post_body)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
print(response.status, response.reason)


print("\n PUT example ")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'testing put'}
json_data = json.dumps(post_body)
conn.request('PUT', '/put', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)


print("\n delete example")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'testing delete'}
json_data = json.dumps(post_body)
conn.request('DELETE', '/delete', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.