Python 模拟 POST 请求发送 application/x-www-form-urlencoded 类型的表单数据 / 含重复键
通过抓包工具可以看到 表单数据的提交类型为application/x-www-form-urlencoded ↓ ↓ ↓这种类型提交的数据就有可能会是这个样子的↓ ↓ ↓;含有重复的Key 不一样的值这种数据如果通过普通的requests.post(url=url, headers=headers, data={'k': 'v1', 'k': 'v2'})字典方式去发送数据肯定是不行的;这样的话字
·
通过抓包工具可以看到 表单数据的提交类型为application/x-www-form-urlencoded
↓ ↓ ↓
这种类型提交的数据就有可能会是这个样子的↓ ↓ ↓;含有重复的Key 不一样的值
这种数据如果通过普通的requests.post(url=url, headers=headers, data={'k': 'v1', 'k': 'v2'})
字典方式去发送数据肯定是行不通的;
字典只会保留第二个值.
解决方案:
from urllib import parse
import requests
data = {
"ID": "xxx",
"KeyName": ["Value1", "Value2"], # 以列表的形式来传值
}
# 注意doseq参数如果不填默认为False;就会把列表真的当成列表来编码
# 这里把doseq改为True;把每个序列元素转换为一个单独的参数
data = parse.urlencode(data, doseq=True)
response = requests.post(url='http://www.xxx.com',data=data)
print(response.json())
当然也可以遍历data后,然后使用urlencode转义再用‘=’和‘&’去遍历拼接,太麻烦不推荐
项目示例
demo.py
# _*_ coding: utf-8 _*_
"""
Time: 2022/3/2 16:59
Author: Jyun
Version: V 0.1
File: demo.py
Blog: https://ctrlcv.blog.csdn.net
"""
import requests
class Items:
def __init__(self):
self.data = {}
def __setitem__(self, key, value):
self.data[key] = value
def encode(self):
from urllib import parse
return parse.urlencode(self.data, doseq=True)
class UploadForm:
def __init__(self):
self.userdata = {} # 从数据库获取数据
self.pagedata = {} # 从页面获取动态数据
self.url = 'http://cc.com'
def submit(self):
data = self.dealt_formdata()
print(data) # only-id=None&name=None&sex=None&cardtype%5B1%5D.cardType=...
# response = requests.post(url=self.url, data=data)
# print(response.text)
def dealt_formdata(self):
item = Items()
item['cctype'] = ['acc', 'bcc']
item['cardtype[1].cardValue'] = 'A0001'
item['cardtype[1].cardType'] = 'DM02-08_09'
item['only-id'] = self.pagedata.get('only-id')
item['name'] = self.userdata.get('name')
if self.userdata.get('sex') == '男':
item['sex'] = '1'
else:
item['sex'] = '2'
return item.encode()
if __name__ == '__main__':
uf = UploadForm()
uf.submit()
更多推荐
已为社区贡献1条内容
所有评论(0)