Python中 requests 是一个常用的第三方 HTTP 请求库,可以方便地向网站发送HTTP请求,并获取响应结果。

目前 HTTP 请求中最常用的请求方式是 GET 和 POST,除它两外使用频率最高的是 PUT 和 DELETE。

虽然还有如 HEAD、OPTIONS、TRACE、PATCH 等请求方式,但使用频率太低,所以本篇只讲述如何使用 GET、POST、PUT 和 DELETE 四种方式发送请求。

请注意,requests库不是Python标准库的一部分,你需要使用pip命令来安装它:

pip install requests

另外,可以下载本人编写的接口源码配合示例使用:

点击下载压缩包,压缩包内含有接口源码及使用说明

GET 请求

关于 GET 请求

GET 请求是 HTTP 协议中的一种请求方法,协议定义 GET 请求用于请求指定资源,仅从服务器获取数据(不应修改服务器状态)。

GET 请求的特点:

  • 数据传输:通过 URL 查询字符串(?key=value)传递参数,参数在URL中可见。
  • 大小限制:由于 URL 长度限制,GET请求传输的参数量有限。
  • 可读性:因为数据在URL中,所以容易被人阅读。
  • 幂等性:相同的GET请求被执行多次,结果相同,不会改变服务器状态。
  • 安全性:由于数据在URL中可见,不适合传输敏感信息。

URL拼参请求

import requests

# 定义请求的URL。示例为部署在本地的接口地址,读者可以下载源码使用
# 或者可以请求其它接口
url = 'http://127.0.0.1:5000/GET/?data1=1&data2=2'  # url拼接参数

# 请求url
response = requests.get(url)

# 打印请求url的响应的状态码和内容
print('响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

响应的状态码和内容:
200
{"code":0,"data":{"result":{"data1":"1","data2":"2"}},"message":"Successful"}

通过 params 传参

默认 params=None,它应该是一个字典。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/GET/'  # 带参数

# 请求url,如果url已经拼接参数,会忽略 params 参数
response = requests.get(url, params={'data1': 123, 'data2': 456})

# 打印请求url的响应的状态码和内容
print('url请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

url请求响应的状态码和内容:
200
{"code":0,"data":{"result":{"data1":"123","data2":"456"}},"message":"Successful"}

POST 请求

关于 POST 请求

POST 请求是一种用于向服务器发送数据,协议定义 POST 请求用于提交数据到服务器,通常用于创建资源或触发服务端处理(如提交表单)。

POST 请求的特点:

  • 数据传输:数据通过请求体发送,不在URL中显示。
  • 大小限制:没有严格的大小限制,可以传输大量数据。
  • 安全性:比 GET 请求更安全,因为数据不会显示在URL中。
  • 非幂等性:相同的POST请求多次执行可能会有不同的效果,如多次提交表单可能会导致数据重复。

POST 请求通常包含请求体,Content-Type 头部非常重要,以下是一些常见的 Content-Type 值及其用途:

  • application/x-www-form-urlencoded:

    这是表单数据的标准格式,通常用于 HTML 表单数据的提交,数据被编码为键值对。

  • multipart/form-data:

    用于文件上传和发送包含文件的表单数据。允许你发送二进制数据和文本数据。

  • application/json:

    用于发送 JSON 格式的数据。这是 RESTful API 常用的数据格式。

  • text/xml 或 application/xml:

    用于发送 XML 格式的数据。现在比较少见,在一些旧的或特定的 API 中仍然使用。

  • text/plain:

    用于发送纯文本数据。较少用于 API 请求,除非 API 明确要求。

发送 json 格式数据

  1. 使用 json 参数

将字典传递给 json 参数,requests 库会自动将数据编码为 application/json 格式,并设置相应的 Content-Type 头部。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'

# JSON 数据
json_data = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发起 POST 请求
response = requests.post(url, json=json_data)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"application/json","result":{"key1":"value1","key2":"value2"}},"message":"Successful"}
  1. 使用 data 参数

当字典中有不可编码对象类型时,可以事先使用 json库 将字典转码为 json 格式的字符串,然后手动指定 application/json。

但推荐使用 json 参数,因为 requests 库也支持自定义编码字典,我们在后面会讲到。

import requests
import json
from datetime import datetime

# 自定义JSONEncoder类
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()  # 将datetime对象序列化为ISO格式的字符串
        return json.JSONEncoder.default(self, obj)

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'


# 定义请求体的数据
json_data = {
    'key1': 'value1',
    'key2': datetime.now()
}

# 将字典转换为JSON格式
json_data = json.dumps(json_data, cls=CustomEncoder)

# 发送 POST 请求,headers 中指定请求体的格式为 application/json
response = requests.post(url, headers={'Content-Type': 'application/json'}, data=json_data)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"application/json","result":{"key1":"value1","key2":"2025-05-30T15:05:44.932557"}},"message":"Successful"}

发送 HTML 表单数据

将字典传递给 data ,requests 库会自动将字典编码为 application/x-www-form-urlencoded 格式,并设置相应的 Content-Type 头部。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'

# 表单数据
form_data = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发起 POST 请求
response = requests.post(url, data=form_data)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"application/x-www-form-urlencoded","result":{"key1":"value1","key2":"value2"}},"message":"Successful"}

发送文件表单数据

将字典传递给 files ,requests 库会自动将数据编码为 multipart/form-data 格式,并设置相应的 Content-Type 头部。

import requests

url = 'http://127.0.0.1:5000/POST/'

# 使用 with 确保文件自动关闭
with open('python.jpg', 'rb') as f:
    files = {     #文件名称、文件内容和文件类型
        'file': ('python.jpg', f, 'image/jpeg'),
    }
    data = {
        'key1': 'value1',
        'key2': 'value2'
    }
    # 发起 POST 请求
    response = requests.post(url, files=files, data=data)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"multipart/form-data; boundary=f2a98cd00cafa5798de6b74ad725a40c","result":{"data":{"key1":"value1","key2":"value2"},"file_name":"python.jpg"}},"message":"Successful"}

发送 XML 格式数据

将 XML 数据传递给 data 参数,Content-Type 定义为 application/xml。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'

# XML 数据
xml_data = """
<note>
  <to>Friends</to>
  <from>JZY</from>
  <heading>Reminder</heading>
  <body>Don't forget me!</body>
</note>
"""

# 自定义请求头
headers = {
    'Content-Type': 'application/xml'
}

# 发起 POST 请求
response = requests.post(url, data=xml_data, headers=headers)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"application/xml","result":{"body":"Don't forget me!","from":"JZY","heading":"Reminder","to":"Friends"}},"message":"Successful"}

发送纯文本数据

将纯文本数据传递给 data 参数,Content-Type 定义为 text/plain。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'

# 纯文本数据
text_data = 'This is plain text data.'

# 自定义请求头
headers = {
    'Content-Type': 'text/plain'
}

# 发起 POST 请求
response = requests.post(url, data=text_data, headers=headers)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"code":0,"data":{"Content-type":"text/plain","result":"This is plain text data."},"message":"Successful"}

发送二进制数据

将纯文本数据传递给 data 参数,Content-Type 定义为 application/octet-stream。

import requests

# 定义请求的URL。该地址是部署在本地的接口地址,读者可以下载源码使用
url = 'http://127.0.0.1:5000/POST/'

# 打开文件并读取其二进制内容
with open('favicon.png', 'rb') as file:
    # 自定义请求头
    headers = {
        'Content-Type': 'application/octet-stream'
    }

    # 发起 POST 请求,发送文件的二进制数据
    response = requests.post(url, data=file, headers=headers)

# 打印POST请求的响应的状态码和内容
print('POST请求响应的状态码和内容:')
print(response.status_code)
print(response.text)

运行结果

POST请求响应的状态码和内容:
200
{"blog_address":"www.jzy-blogs.cn","code":0,"data":{"content_type":"application/octet-stream","result":"base64"},"message":"Successful"}

PUT 请求

关于 PUT 请求

PUT 请求是 HTTP 协议中的一种请求方法,协议定义 PUT 请求用于完整替换目标资源(客户端需提供完整的新资源数据)。若资源不存在,可创建新资源。在实际业务中常被 POST 请求替代。

PUT 请求的特点:

  • 数据传输:数据通过请求体发送,不在URL中显示。
  • 大小限制:没有严格的大小限制,可以传输大量数据。
  • 幂等性:相同的 PUT 请求被执行多次,结果相同。
  • 安全性:PUT方法如果配置不当(如WebDAV未正确限制),可能导致文件上传漏洞,攻击者可利用它上传恶意文件。因此,许多服务器默认禁用PUT或严格限制其使用。

发送 PUT 请求方法

使用 requests.put() 方法,其余 requests.post() 基本一致,参考 POST 请求内容即可。

DELTET 请求

关于 DELETE 请求

DELETE 请求是 HTTP 协议中的一种请求方法,协议定义 DELETE 请求用于删除指定资源(URI指向的目标)。在实际业务中常被 POST 请求替代。

DELETE 请求的特点:

  • 数据传输:通常不需要传递参数。
  • 幂等性:只要第一次可以请求成功,后续 404。
  • 安全性:有可能恶意删除文件。

发送 DELETE 请求方法

使用 requests.delete() 方法:

import requests

# 目标资源URL(需包含要删除的资源ID)
url = "https://example.com/api/users/123"

# 发送DELETE请求
response = requests.delete(url)

# 处理响应
print(f"状态码: {response.status_code}")  # 成功通常返回 200 或 204
print(f"响应内容: {response.text}")      # 可能是空或确认信息

END



© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0