这篇文章讨论了Python的两种 HTTP(超文本传输协议)请求方法 GET 和 POST 请求及其在Python的实现。
什么是 HTTP?
HTTP 是一组旨在实现客户端和服务器之间通信的协议。它用作客户端和服务器之间的请求-响应协议。
Web 浏览器可能是客户端,而托管网站的计算机上的应用程序可能是服务器。
所以,向服务器请求响应,主要有两种方法:
- GET :从服务器请求数据。
- POST :将要处理的数据提交到服务器。
这是一个简单的图表,它解释了 GET 和 POST 方法的基本概念。
现在,要在Python发出 HTTP 请求,我们可以使用几个 HTTP 库,例如:
- httplib
- 网址库
- 要求
上面列出的库中最优雅和最简单的是 Requests。我们将在本文中使用请求库。要下载和安装请求库,请使用以下命令:
pip install requests
或者,从这里下载并手动安装。
发出 Get 请求
# importing the requests library
import requests
# api-endpoint
URL = "http://maps.googleapis.com/maps/api/geocode/json"
# location given here
location = "delhi technological university"
# defining a params dict for the parameters to be sent to the API
PARAMS = {'address':location}
# sending get request and saving the response as response object
r = requests.get(url = URL, params = PARAMS)
# extracting data in json format
data = r.json()
# extracting latitude, longitude and formatted address
# of the first matching location
latitude = data['results'][0]['geometry']['location']['lat']
longitude = data['results'][0]['geometry']['location']['lng']
formatted_address = data['results'][0]['formatted_address']
# printing the output
print("Latitude:%s\nLongitude:%s\nFormatted Address:%s"
%(latitude, longitude,formatted_address))
输出:
上面的示例通过向 Google Maps API 发送 GET 请求来查找给定位置的纬度、经度和格式化地址。 API(应用程序编程接口)使您能够以有限的方式访问程序的内部功能。在大多数情况下,提供的数据采用 JSON(JavaScript Object Notation)格式(在Python实现为字典对象!)。
要推断的要点:
-
PARAMS = {'address':location}
GET 请求的 URL 通常带有一些参数。对于请求库,参数可以定义为字典。这些参数稍后会被解析并添加到基本 url 或 api-endpoint。
要了解参数的作用,请尝试在创建响应对象后打印r.url 。你会看到这样的事情:http://maps.googleapis.com/maps/api/geocode/json?address=delhi+technological+university
这是发出 GET 请求的实际 URL
-
r = requests.get(url = URL, params = PARAMS)
在这里,我们创建了一个响应对象“r”,它将存储请求-响应。我们使用 requests.get() 方法,因为我们正在发送 GET 请求。我们传递的两个参数是 url 和参数字典。
-
data = r.json()
现在,为了从响应对象中检索数据,我们需要将原始响应内容转换为 JSON 类型的数据结构。这是通过使用 json() 方法实现的。最后,我们通过解析 JSON 类型对象来提取所需的信息。
发出 POST 请求
# importing the requests library
import requests
# defining the api-endpoint
API_ENDPOINT = "http://pastebin.com/api/api_post.php"
# your API key here
API_KEY = "XXXXXXXXXXXXXXXXX"
# your source code here
source_code = '''
print("Hello, world!")
a = 1
b = 2
print(a + b)
'''
# data to be sent to api
data = {'api_dev_key':API_KEY,
'api_option':'paste',
'api_paste_code':source_code,
'api_paste_format':'python'}
# sending post request and saving response as response object
r = requests.post(url = API_ENDPOINT, data = data)
# extracting response text
pastebin_url = r.text
print("The pastebin URL is:%s"%pastebin_url)
此示例说明如何通过将 POST 请求发送到 PSTEBIN 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”,它将存储请求-响应。我们使用 requests.post() 方法,因为我们正在发送 POST 请求。我们传递的两个参数是 url 和数据字典。
-
pastebin_url = r.text
作为响应,服务器处理发送给它的数据并发送您的source_code的 pastebin URL,它可以通过r.text 轻松访问。
requests.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 方法。
本博客由Nikhil Kumar 提供。如果您喜欢 GeeksforGeeks 并愿意做出贡献,您也可以使用 write.geeksforgeeks.org 撰写文章或将您的文章邮寄至 review-team@geeksforgeeks.org。在 GeeksforGeeks 主页上查看您的文章并帮助其他 Geeks。