📜  使用Python进行GET和POST请求

📅  最后修改于: 2020-04-15 05:24:25             🧑  作者: Mango

这篇文章讨论了Python中的两个HTTP(超文本传输​​协议)请求方法GET和POST请求以及它们在Python中的实现。
什么是HTTP?
HTTP是一组旨在支持客户端和服务器之间通信的协议。它用作客户端和服务器之间的请求-响应协议。
Web浏览器可能是客户端,托管网站的计算机上的应用程序可能是服务器。
因此,要从服务器请求响应,主要有两种方法:

  1. GET:从服务器请求数据。
  2. POST:将要处理的数据提交到服务器。

这是一个简单的图,说明了GET和POST方法的基本概念。


现在,要在Python中发出HTTP请求,我们可以使用几个HTTP库,例如:

上面列出的库中最优雅,最简单的是requests。我们将在本文中使用requests库。要下载并安装请求库,请使用以下命令:

pip install requests

或者,从此处下载它并手动安装。

发出获取请求

# 导入requests库
import requests
# api端点
URL = "http://maps.googleapis.com/maps/api/geocode/json"
# 此处给出的位置
location = "delhi technological university"
# 为要发送到API的参数定义一个params dict
PARAMS = {'address':location}
# 发送获取请求并将响应保存为响应对象
r = requests.get(url = URL, params = PARAMS)
# 以json格式提取数据
data = r.json()
# 提取第一个匹配位置的纬度,经度和格式化地址
latitude = data['results'][0]['geometry']['location']['lat']
longitude = data['results'][0]['geometry']['location']['lng']
formatted_address = data['results'][0]['formatted_address']
# 打印输出
print("Latitude:%s\nLongitude:%s\nFormatted Address:%s"
      %(latitude, longitude,formatted_address))

输出:
1个
上面的示例通过向Google Maps API发送GET请求来查找给定位置的纬度,经度和格式地址。API(应用程序编程接口)使您能够以有限的方式访问程序的内部功能。并且在大多数情况下,提供的数据为JSON(JavaScript对象表示法)格式(在Python中实现为字典对象!)。

重要要点:

PARAMS = {'address':location}

GET请求的URL通常带有一些参数。对于请求库,可以将参数定义为字典。这些参数随后将被解析并添加到基本url或api端点中。
要了解参数角色,在创建响应对象后尝试打印r.url。您将看到如下内容:

http://maps.googleapis.com/maps/api/geocode/json?address=delhi+technologic+university

这是发出GET请求的实际URL

r = request.get(URL = URL,params = PARAMS)

在这里,我们创建一个响应对象“ r”,该对象将存储请求-响应。我们使用request.get()方法,因为我们正在发送GET请求。我们传递的两个参数是url和参数字典。

data = r.json()
  • 现在,为了从响应对象中检索数据,我们需要将原始响应内容转换为JSON类型的数据结构。这是通过使用json()方法实现的。最后,我们通过解析JSON类型对象来提取所需的信息。

发出POST请求

# 导入请求库
import requests
# 定义api端点
API_ENDPOINT = "http://pastebin.com/api/api_post.php"
# 您的API密钥在这里
API_KEY = "XXXXXXXXXXXXXXXXX"
# 您的源代码在这里
source_code = '''
print("Hello, world!")
a = 1
b = 2
print(a + b)
'''
# 数据要发送到api
data = {'api_dev_key':API_KEY,
        'api_option':'paste',
        'api_paste_code':source_code,
        'api_paste_format':'Python'}
# 发送发布请求并将响应保存为响应对象
r = requests.post(url = API_ENDPOINT, data = data)
# 提取响应文本
pastebin_url = r.text
print("The pastebin URL is:%s"%pastebin_url)

本示例说明了如何通过将POST请求发送到PASTEBIN API 来将source_code粘贴到pastebin.com
首先,您需要通过在此处进行注册来生成API密钥,然后在此处访问您的API密钥。
该代码的重要功能:

data = {'api_dev_key':API_KEY,
        'api_option':'paste',
        'api_paste_code':source_code,
        'api_paste_format':'Python'}

同样,我们将需要将一些数据传递到API服务器。我们将此数据存储为字典。

r = requests.post(url = API_ENDPOINT, data = data)

在这里,我们创建一个响应对象“ r”,该对象将存储请求-响应。我们使用request.post()方法,因为我们正在发送POST请求。我们传递的两个参数是url和数据字典。

pastebin_url = r.text
  • 作为响应,服务器处理发送给它的数据,并发送source_code的pastebin URL ,可以通过r.text对其进行简单地访问

request.post方法可用于许多其他任务,例如填写和提交Web表单,使用Facebook Graph API在FB时间轴上发布等。
以下是需要考虑的一些重要点:

  • 当方法为GET时,所有表单数据都被编码到URL中,并作为查询字符串参数附加到操作 URL中。使用POST,表单数据将显示在HTTP请求的消息正文中。
  • 在GET方法中,参数数据限于我们可以填充到请求行(URL)中的内容。使用少于2K的参数最安全,一些服务器最多可以处理64K。在POST方法中没有这样的问题,因为我们在HTTP请求的消息正文而不是URL中发送数据。
  • GET方法中只允许使用ASCII字符发送数据。POST方法中没有这种限制。
  • 与POST相比,GET安全性较低,因为发送的数据是URL的一部分。因此,发送密码或其他敏感信息时不应使用GET方法。