1、multipart/form-data 请求
比较常见的 content-type 一般是以下2种:
application/json
application/x-www-form-urlencoded
使用requests发网络请求时,只要在data or json里带上对应的数据就能正常发请求了。
但是——
multipart/form-data 数据直接在放到data 里,一定报错。
这时,需要转码一下.
2、multipart/form-data 参数转码
比如请求参数是:
--e0ed233c-3202-47c6-9c96-f9181e308
Content-Disposition: form-data; name="id"
Content-Transfer-Encoding: binary
Content-Type: application/json; charset=UTF-8
Content-Length: 13
234545878
--e0ed233c-3202-47c6-9c96-f9181e308
Content-Disposition: form-data; name="type"
Content-Transfer-Encoding: binary
Content-Type: application/json; charset=UTF-8
Content-Length: 1
1
--e0ed233c-3202-47c6-9c96-f9181e308--
也就是说,有2个 key -> id 和 type
fields={
"id": '234545878',
"type": '1'
}
直接这样发请求,会失败。⬆️
encode一下就能发请求了。⬇️
from requests_toolbelt.multipart.encoder import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
"id": '1653302392217',
"read_duration_list": read_duration_list,
"now": now,
"type": '1'
}
)
header['Content-Type'] = multipart_data.content_type
header['accept'] = 'application/json'
3、一个实际案例
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
upload_url = "https://api.code.com/upload"
now = str(get_msec())
read_duration_list= '[{"id":234545878,"type":2,"duration":11,"start_time":'+str(now)+',"trigger_page":"PersonalPage"}]'
multipart_data = MultipartEncoder(
fields={
"id": '1653302392217',
"read_duration_list": read_duration_list,
"now": now,
"type": '1'
}
)
header['Content-Type'] = multipart_data.content_type
header['accept'] = 'application/json'
upload = requests.post(upload_url, header=header, data=multipart_data)
print(f"upload:{
upload}")