Python中使用requests提交multipart form data时如何插入一个值为字符串的field
抓包到的请求是这样的:
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name="fid"
1
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“moduleid”
5
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“from”
album
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“old”
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“isremote”
0
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“remote”
http://
-----------------------------13151347596532282191711782459
Content-Disposition: form-data; name=“upalbum”; filename="\B0·Ұͺ\D5ͼ.png"
Content-Type: image/png
python 代码:
import requests
multipart_form_data = {
'upalbum': ('111.png', open('1.png', 'rb'), 'image/png'),
'fid': ('', ''),
'muduleid': ('', '5'),
'from': ('', 'album'),
'old': ('', ''),
'isremote': ('', '0'),
'remote': ('', 'http://')
}
requests.post('http://127.0.0.1:8888', files=multipart_form_data)
然后在 fiddle 中看到模拟的请求少了几个 field:
--9b67b0c1b58b473d86ca619bac4bdd0d
Content-Disposition: form-data; name="from"; filename=""
album
–9b67b0c1b58b473d86ca619bac4bdd0d
Content-Disposition: form-data; name=“fid”; filename=""
–9b67b0c1b58b473d86ca619bac4bdd0d
Content-Disposition: form-data; name=“upalbum”; filename=“111.png”
Content-Type: image/png
Python中使用requests提交multipart form data时如何插入一个值为字符串的field
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
# 方法1:使用requests原生方式
def submit_form_with_string_field():
# 准备表单数据
form_data = {
'username': 'john_doe', # 字符串字段
'email': 'john@example.com',
'file': ('report.pdf', open('report.pdf', 'rb'), 'application/pdf') # 文件字段
}
# 发送POST请求
response = requests.post(
'https://httpbin.org/post',
files=form_data
)
return response.json()
# 方法2:使用MultipartEncoder(更灵活)
def submit_form_with_multipart_encoder():
# 创建MultipartEncoder对象
multipart_data = MultipartEncoder(
fields={
'username': 'john_doe', # 直接传入字符串
'email': 'john@example.com',
'file': ('report.pdf', open('report.pdf', 'rb'), 'application/pdf')
}
)
# 设置正确的Content-Type头
headers = {'Content-Type': multipart_data.content_type}
response = requests.post(
'https://httpbin.org/post',
data=multipart_data,
headers=headers
)
return response.json()
# 方法3:混合使用files和data参数
def submit_form_mixed():
# 文件字段用files参数
files = {'file': open('report.pdf', 'rb')}
# 字符串字段用data参数
data = {
'username': 'john_doe',
'email': 'john@example.com'
}
response = requests.post(
'https://httpbin.org/post',
files=files,
data=data
)
return response.json()
# 测试示例
if __name__ == '__main__':
# 注意:实际运行前请确保有report.pdf文件或调整代码
print("方法1结果:", submit_form_with_string_field())
print("\n方法2结果:", submit_form_with_multipart_encoder())
print("\n方法3结果:", submit_form_mixed())
核心要点:
- 直接传字符串:在
files字典或MultipartEncoder的fields中,字符串值直接作为value传入 - 文件字段格式:文件需要三元组
(filename, fileobj, content_type)或二元组(filename, fileobj) - Content-Type:使用
MultipartEncoder时需要手动设置multipart_data.content_type
简单总结: 在multipart表单中,字符串字段直接作为键值对传入即可。
其余字段放在放在 data 里面
#1 解决了,谢谢

