aiohttp.ClientSession多部分/表单数据



我有一个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

最新更新