requests提交form表单

问题:

对接接口,发现对方的接口使用form-data进行数据提交,直接使用requests库的data参数对接,会报参数错误:

复制代码
params = {
    'timestamp':timestamp,
    'nonce':nonce,
    'apikey':APIKEY,
    'signature': signature
}
data = {
    'name': name,
    'phone': phone,
    'idnum': idnum,
    'products': [201,]
}
resp = requests.post(URL, data=data, params=params,
                     verify=False, timeout=10)      
复制代码

错误提示

报错信息

解决方案

这一块Requests包做的不是很好,做法具体如下:

1.一种是手动组建form-data并加上headers;数,data参数需要自己用boundary来分隔为指定的形式

2.另一种是通过files参数传递form-data,files参数则以元组的形式传入;

3.第三方模块,requests-toolbelt

复制代码

# 方案一:
params = {
'timestamp':timestamp,
'nonce':nonce,
'apikey':APIKEY,
'signature': signature
}
payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"products\"\r\n\r\n {}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,])
headers = {
"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
resp = requests.post(URL, data=payload, params=params,
verify=False, timeout=10, headers=headers)

# 方案二:以传入files参数
import json
params = {
'timestamp':timestamp,
'nonce':nonce,
'apikey':APIKEY,
'signature': signature
}
data = {
'name':(None, name),
'phone': (None, str(phone)),
'idnum': (None, idnum),
'products': (None, json.dumps([201,]))
}
resp = requests.post(URL, files=data, params=params,
verify=False, timeout=10)
print(resp.status_code)
print(resp.request.url)
print(resp.request.body)
print(resp.text )
 
复制代码

 

结果

 

方案三:利用第三方模块(requests-toolbelt)

 1、安装

pip install requests-toolbelt

这里我们会用到MultipartEncoder方法

MultipartEncoder上传文件用法

import requests
from requests_toolbelt import MultipartEncoder

encoder = MultipartEncoder({'field': 'value',
                            'other_field':'other_value'},boundary="--asddddddddddddddddd")
r = requests.post('https://httpbin.org/post', data=encoder,
                  headers={'Content-Type': encoder.content_type})

MultipartEncoder填写表格用法

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})

r = requests.post('http://httpbin.org/post', data=m,
                  headers={'Content-Type': m.content_type})

 

转自:https://www.freesion.com/article/248781736/

 

posted @   阿布_alone  阅读(1908)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
TOP
点击右上角即可分享
微信分享提示