Python中的简单URL GET / POST函数


78

我似乎无法在Google上找到它,但是我想要一个执行此操作的函数:

接受3个参数(或更多参数):

  • 网址
  • 参数字典
  • POST或GET

返回结果和响应代码。

有一个摘要吗?


问题尚不清楚-这是针对本地URL的。您正在编写服务器或远程URL,即。你在写客户吗?
查尔斯·达菲

请在将来使用更多的问题-描述性标题。
Kissaki 2010年

Answers:


109

要求

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年

如果您没有第3方库就以本机方式执行此操作,那就太好了。
用户

为什么这是答案?这不是功能!!!
uberrebu

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
在对我有用之前,我必须将post_data包装在json.dumps()中:data=json.dumps(post_data)
Matt

1
@Matt,我认为这取决于您是要提交表单编码的数据(仅传递dict)还是非表单编码的数据(传递JSON数据字符串)。我指的是这里的文档:docs.python-requests.org/en/latest/user/quickstart / ...
2014年

Windows有该模块的任何版本吗?
TheGoodUser 2014年

@TheGoodUser该库(以及更多)是为Windows编译的,可在以下位置
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
我更喜欢这个,因为它坚持使用标准库。
查尔斯·达菲

应该是url +“?” 而不是url +'&'?
Paulo Scardine 2010年

1
很好,但是准确地说,Request对象本身没有结果数据或响应代码-需要通过诸如这样的方法来“请求”它urlopen
2014年

@Bach您是否有一个示例代码,可以在此处使用URLRequest方法来实现诸如urlopen之类的“请求的”代码?我在任何地方都找不到。
theJerm 2015年

@theJerm,我已经引用了它。尝试r = urllib2.urlopen(url),然后r.readlines()和/或r.getcode()。您可能还希望考虑使用“请求”
2015年

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'
                         )

[更新]

这些答案中有些是旧的。今天,我将使用requestsrobaple的答案之类的模块。


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.