当前位置:首页>python>【Python程序开发系列】详细解读http的Body的五种格式:form-data、x-www-form-urlencoded、json、raw、binary(案例分析)

【Python程序开发系列】详细解读http的Body的五种格式:form-data、x-www-form-urlencoded、json、raw、binary(案例分析)

  • 2026-09-10 12:06:52
【Python程序开发系列】详细解读http的Body的五种格式:form-data、x-www-form-urlencoded、json、raw、binary(案例分析)

这是我的第461篇原创文章。

写在前面

『数据杂坛』以Python语言为核心,垂直于数据科学领域,专注于(可戳👉)Python程序设计|数据分析|特征工程|机器学习分类|机器学习回归|深度学习分类|深度学习回归|单变量时序预测|多变量时序预测|语音识别|图像识别|自然语音处理|大语言模型|软件设计开发等技术栈交流学习,涵盖数据挖掘、计算机视觉、自然语言处理等应用领域。(文末有惊喜福利)

一、引言

五种格式对比总览

格式
Content-Type
x-www-form-urlencodedapplication/x-www-form-urlencoded
form-datamultipart/form-data
jsonapplication/json
rawtext/plain等
binaryapplication/octet-stream等

二、实现过程

2.1 JSON(application/json)

特点

  • 结构化数据,支持嵌套

  • 数据类型丰富(字符串、数字、布尔、数组、对象)

  • 不能传文件

服务端:Python (Flask接收并处理)

from flask import Flask, requestapp = Flask(__name__)@app.route('/api/user', methods=['POST'])def create_user():    # 获取 JSON 数据    data = request.get_json()  # 解析为 Python 字典    name = data.get('name')    age = data.get('age')    hobbies = data.get('hobbies', [])    return {        'message': f'创建用户:{name}',        'hobbies_count': len(hobbies)    }if __name__ == '__main__':    app.run(host='0.0.0.0', port=8000, debug=True)

客户端:Python (发送 JSON)

import jsonimport requestsdata = {    'name': '张三',    'age': 25,    'hobbies': ['读书', '游泳'],    'is_vip': True}response = requests.post(    'http://175.27.139.104:8000/api/user',    json=data,   # 默认就是 json    headers={'Content-Type': 'application/json'})print(response.json())

响应:

2.2 x-www-form-urlencoded

特点

  • 键值对格式:key1=value1&key2=value2

  • 特殊字符会 URL 编码(如空格→+,中文→%E4%B8%AD)

  • 只适合字符串,不能传文件

服务端:Python (Flask接收并处理)

from flask import Flask, requestapp = Flask(__name__)@app.route('/login', methods=['POST'])def login():    username = request.form.get('username') # 用 request.form    password = request.form.get('password')    return f'用户:{username}'if __name__ == '__main__':    app.run(host='0.0.0.0', port=8000, debug=True)

客户端:Python (发送data)

import requestsdata = {    'username': 'admin',    'password': '123456',    'name': '张三'  # 会自动编码为 %E5%BC%A0%E4%B8%89}response = requests.post(    'http://175.27.139.104:8000/login',    data=data,  # 默认就是 x-www-form-urlencoded    headers={'Content-Type': 'application/x-www-form-urlencoded'})print(response.text)

响应:

2.3 form-data(multipart/form-data)

特点

  • 支持文件上传

  • 可以混合文本字段和文件

  • 用 boundary 分隔不同字段

服务端:Python(Flask接收并处理)

from flask import Flask, requestapp = Flask(__name__)@app.route('/upload', methods=['POST'])def upload():     # 获取文件    file = request.files['image']  # FileStorage 对象    file.save(f'./uploads/{file.filename}')    # 获取其他字段    description = request.form.get('description')    return {        'filename': file.filename,        'size': len(file.read()),        'description': description    }if __name__ == '__main__':    app.run(host='0.0.0.0', port=8000, debug=True)

客户端:Python (发送文件)

import requests# 文件路径file_path = 'photo.jpg'with open(file_path, 'rb') as f:    # files 参数:{字段名: (文件名, 文件对象, MIME类型)}    files = {        'image': ('photo.jpg', f, 'image/jpeg')    }    # 其他表单数据    data = {        'description': '我的照片',        'user_id': '12345'    }    response = requests.post(        'http://175.27.139.104:8000/upload',        files=files,   # 文件        data=data      # 其他字段    )print(response.json())

响应:

读取文件并重新存储在uploads目录下:

2.4 Raw(纯文本)

特点

  • 无结构,纯字符串

  • 可以自定义格式(XML、HTML、自定义协议)

  • 灵活性高,但需要自行解析

服务端:Python (Flask接收并处理)

from flask import Flask, requestapp = Flask(__name__)@app.route('/webhook', methods=['POST'])def webhook():    # 获取原始数据    raw_data = request.data  # bytes 类型    text = raw_data.decode('utf-8')    print(f"收到消息:{text}")    return f"收到消息:{text}"if __name__ == '__main__':    app.run(host='0.0.0.0', port=8000, debug=True)

客户端:Python (发送Raw)

import requests# 发送纯文本text = "这是一条日志消息\n时间:2024-01-01\n级别:ERROR"response = requests.post(    'http://175.27.139.104:8000/webhook',    data=text,  # 直接传字符串    headers={'Content-Type': 'text/plain'})print(response.text)# 发送 XMLxml_data = """<?xml version="1.0"?><user>    <name>张三</name>    <age>25</age></user>"""response = requests.post(    'http://175.27.139.104:8000/webhook',    data=xml_data,    headers={'Content-Type': 'application/xml'})print(response.text)

响应:

2.5 Binary(二进制)

特点

  • 原始字节流,无文本编码

  • 适合传输文件、图片、视频、音频

  • 通常配合特定 Content-Type

服务端:Python (Flask接收并处理)

from flask import Flask, requestapp = Flask(__name__)@app.route('/upload/image', methods=['POST'])def upload_image():    # 获取原始二进制数据    image_data = request.data  # bytes    # 保存    with open('received.jpg', 'wb') as f:        f.write(image_data)    return {'size': len(image_data)}if __name__ == '__main__':    app.run(host='0.0.0.0', port=8000, debug=True)

客户端:Python (发送Binary)

import requests# # 读取二进制文件# with open('photo.jpg', 'rb') as f:#     binary_data = f.read()# response = requests.post(#     'http://175.27.139.104:8000/upload/image',#     data=binary_data,  # 直接传 bytes#     headers={#         'Content-Type': 'image/jpeg',#         'X-Filename': 'photo.jpg'#     }# )# 或者直接用文件对象(推荐)with open('photo.jpg', 'rb') as f:    response = requests.post(        'http://175.27.139.104:8000/upload/image',        data=f,  # 文件对象        headers={        'Content-Type': 'image/jpeg',        'X-Filename': 'photo.jpg'        }    )print(response.json())

响应:

接收二进制数据并处理(存文件)

三、小结

关键对比表

需求
选择格式
Python 参数
简单表单(登录、搜索)
x-www-form-urlencodeddata=dict
文件上传
multipart/form-datafiles=dict
复杂结构化数据
application/jsonjson=dict
纯文本/日志/XML
text/plaindata=str
图片/视频/大文件
application/octet-streamdata=bytes

根据场景选择

格式
适用场景
x-www-form-urlencoded
简单表单提交
form-data
文件上传、混合数据
json
REST API、前后端交互
raw
Webhook、日志、特殊协议
binary
文件下载、图片视频

结束!

热门原创文章推荐阅读点击标题可跳转
写在后面

作者简介:

读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历不定期持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。

致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。

1、关注下方公众号,点击“领资料”即可免费领取电子资料书籍。

2、文章底部点击喜欢作者即可联系作者获取相关数据集和源码。

3、数据算法方向论文指导或就业指导,点击“联系我”添加作者微信直接交流。

4、有商务合作相关意向,点击“联系我”添加作者微信直接交流。

免费电子书籍,带你入门人工智能:

最新文章

随机文章