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

一、引言
| x-www-form-urlencoded | application/x-www-form-urlencoded |
| form-data | multipart/form-data |
| json | application/json |
| raw | text/plain等 |
| binary | application/octet-stream等 |
二、实现过程
特点
结构化数据,支持嵌套
数据类型丰富(字符串、数字、布尔、数组、对象)
不能传文件
服务端: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, # 默认就是 jsonheaders={'Content-Type': 'application/json'})print(response.json())
响应:

特点
键值对格式: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.formpassword = 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-urlencodedheaders={'Content-Type': 'application/x-www-form-urlencoded'})print(response.text)
响应:

特点
支持文件上传
可以混合文本字段和文件
用 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目录下:


特点
无结构,纯字符串
可以自定义格式(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)
响应:

特点
原始字节流,无文本编码
适合传输文件、图片、视频、音频
通常配合特定 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())
响应:

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

三、小结
关键对比表
x-www-form-urlencoded | data=dict | |
multipart/form-data | files=dict | |
application/json | json=dict | |
text/plain | data=str | |
application/octet-stream | data=bytes |
根据场景选择
| x-www-form-urlencoded | |
| form-data | |
| json | |
| raw | |
| binary |
结束!
作者简介:
读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历不定期持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。
致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。
1、关注下方公众号,点击“领资料”即可免费领取电子资料书籍。
2、文章底部点击喜欢作者即可联系作者获取相关数据集和源码。
3、数据算法方向论文指导或就业指导,点击“联系我”添加作者微信直接交流。
4、有商务合作相关意向,点击“联系我”添加作者微信直接交流。

