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

3 回复
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())

核心要点:

  1. 直接传字符串:在files字典或MultipartEncoder的fields中,字符串值直接作为value传入
  2. 文件字段格式:文件需要三元组(filename, fileobj, content_type)或二元组(filename, fileobj)
  3. Content-Type:使用MultipartEncoder时需要手动设置multipart_data.content_type

简单总结: 在multipart表单中,字符串字段直接作为键值对传入即可。


其余字段放在放在 data 里面

#1 解决了,谢谢

回到顶部