我有一个curl
请求:
# form data: id = 247, name = Test
curl '{HOST}'
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundarywiBIWjWR7osAkgFI'
--data-raw $'------WebKitFormBoundarywiBIWjWR7osAkgFIrnContent-Disposition: form-data; name="id"rnrn247rn'
'------WebKitFormBoundarywiBIWjWR7osAkgFIrnContent-Disposition: form-data; name="name"rnrnTestrn'
'------WebKitFormBoundarywiBIWjWR7osAkgFI--rn'
使用requests
+requests_toolbelt
:发送相同请求
mp = MultipartEncoder(
fields={'id': '247', 'name': 'Test'},
boundary='----WebKitFormBoundarywiBIWjWR7osAkgFI'
)
answer = requests.post(
'{HOST}',
data=mp,
headers={'Content-Type': mp.content_type })
但是,如何使用aiohttp.ClientSession
发送相同的请求?我试过使用MultipartWriter + set_content_disposition()
或FormData + add_field()
,但显然我在上做错事
在我的情况下运行良好:
boundary = '----WebKitFormBoundarywiBIWjWR7osAkgFI'
with aiohttp.MultipartWriter('form-data', boundary) as writer:
# custom headers...
# writer.headers['User-Agent'] = '...'
data = {'id': '247', 'name': 'Test'}
for key, value in data.items():
part = writer.append(value, {'content-type': 'form-data'})
part.set_content_disposition('form-data', name=key)
async with session.post('{HOST}', data=writer) as resp:
data = await resp.json()
JFYI:如果需要发送表单字段,可以使用quote_fields=False
:
part = writer.append('VALUE', {'content-type': 'form-data'})
part.set_content_disposition('form-data', False, name='form_fields[field_0]')
结果:
------WebKitFormBoundaryGWdKpzFAElN34726rnContent-Disposition: form-data; name="form_fields[field_0]"rnrnVALUErn