x-www-form-urlencoded
application/x-www-form-urlencoded
和 application/json
是两种不同的 HTTP 请求体格式,它们在 Python 中的处理方式也不同。
application/x-www-form-urlencoded
是 Web 表单默认的提交方法,浏览器会将表单数据编码为 key-value 键值对,并将其放在请求体中。该格式数据可以通过 Python 中的标准库 urllib.parse
进行解析,例如:
from urllib.parse import parse_qs
# 请求体数据
data = b'name=John&age=30'
# 从请求体中解析出表单数据
form_data = parse_qs(data.decode())
此时 form_data
的结果为:
{'name': ['John'], 'age': ['30']}
而 application/json
是一种常用的数据格式,在这种格式下,请求体中的数据会被编码成 JSON 格式,并放在请求体中,需要使用 json
库进行解析。例如:
import json
# 请求体数据
data = b'{"name": "John", "age": 30}'
# 从请求体中解析出 JSON 数据
json_data = json.loads(data)
此时 json_data
的结果为:
{'name': 'John', 'age': 30}
综上所述,application/x-www-form-urlencoded
和 application/json
的处理方式有所不同,需要根据实际情况进行选择和使用。
form-data
multipart/form-data
是一种比较常见的 HTTP 请求体格式,常用于对二进制或文本文件进行上传。这种格式不同于 application/x-www-form-urlencoded
,它可以在请求体中传输二进制数据,也就是允许上传文件。
在 Python 中,处理 multipart/form-data
类型的请求体可以使用 requests
库中的 post
方法。例如:
import requests
# 文件路径
file_path = 'example.jpg'
# 发送 POST 请求
response = requests.post(
'http://example.com/upload',
files={'file': open(file_path, 'rb')}
)
在这个例子中,我们使用 requests
库的 post
方法发送一个 multipart/form-data
类型的 POST 请求,上传指定路径下的文件。使用字典形式的 files
参数来传递上传的文件,字典的 key 为提交数据的字段名称,字典的 value 为文件对象(使用 Python 内置 open()
函数打开文件对象)。
如果请求体中包含了其他的表单数据,可以使用字典形式的 data
参数来传递这些数据,类似于 application/x-www-form-urlencoded
的格式。示例:
import requests
# 文件路径和其他表单数据
file_path = 'example.jpg'
data = {'name': 'John', 'age': '30'}
# 发送 POST 请求
response = requests.post(
'http://example.com/upload',
files={'file': open(file_path, 'rb')},
data=data
)
在此例子中,我们除了上传文件之外,还将一个包含姓名和年龄的表单数据一并上传。字典形式的 data
参数用来传递这些数据。
requests库post请求参数data、json和files的使用
参考:https://blog.csdn.net/qq_31699845/article/details/124849600
传文件和表单示例
如果要传文件,可以使用 requests
库的 files
参数来实现文件上传。使用 files
参数,它将自动采用 multipart/form-data
格式来编码请求体数据。
下面是一个例子,展示如何在客户端发送文件上传请求,包括一个文件和一些文本数据:
import requests
url = 'http://localhost:8000/upload'
files = {'file': open('example.txt', 'rb')}
data = {'name': 'John', 'age': '30', 'gender': 'Male'}
response = requests.post(url, files=files, data=data)
print(response.text)
在上面的代码中,我们向 http://localhost:8000/upload
发送了一个 POST
请求。files
参数是一个字典类型。字典的键就是表单字段名,值可以是字符串或者文件字节。在上面的代码中,example.txt
是一个需要上传的文本文件。表单中的其他数据采用了 data
参数传递,也是一个字典类型。
在服务端,我们可以使用 FastAPI 框架来解析上传的文件和表单数据:
from fastapi import FastAPI, File, Form, UploadFile
app = FastAPI()
@app.post("/upload")
async def create_upload_file(file: UploadFile = File(...), name: str = Form(...), age: int = Form(...), gender: str = Form(...)):
content = await file.read()
return {"filename": file.filename, "name": name, "age": age, "gender": gender}
在上面的代码中,我们定义了一个 /upload
的路由,使用了 FastAPI 框架。使用 UploadFile
类型解析上传的文件,使用 Form
类型解析表单中的其他数据。在 create_upload_file
函数中,使用了 file.read()
方法来获得上传文件的内容。可以将上传文件的文件名、表单中的其他数据返回给客户端。
在本例中,客户端将文件和表单数据一起发送到服务器,而服务器使用 UploadFile
和 Form
类型来解析它们。FastAPI 框架允许我们很容易地把所有这些格式的请求数据都组合在一起。”
希望这个例子能够帮助你。