最近在工作中遇到问题,给嵌入式设备升降级,发现它的升级文件的请求载荷是MIME格式的,然而百度迟迟找不到合适的方案,后得一高人相助,遂解,故此记录,以备遗忘。
1、正确的请求体
这里面值得注意的是,headers字段里面的数据不要弄错,不然会找半天最后发现多了一个http前缀之类的问题。
2、python中构造和python请求体
# 读取本地文件并转换为二进制
try:
with open(firmware_path, mode='rb') as f:
files = {"Software_Upgrade_File": (firmware_name, f, "application/octet-stream")}
upgrade_headers: Dict[str, str] = {
"Referer": f"{self.lm150_ip}/admin/system/upgrade.html",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
}
# 进行升级请求
rsp = self.lm150_session.post(url=url, headers=upgrade_headers, files=files, timeout=60)
print('[system]downgrade_bsp:上传文件返回结果:', rsp)
except Exception as error:
print('[system]downgrade_bsp:读取本地文件-转换二进制出错。', error)
这里的关键是,构造的请求头中不能有Content-type字段,如果强制写了这个字段,则会构造失败。
随后抓包能够看到请求正常。