最近在工作中遇到问题,给嵌入式设备升降级,发现它的升级文件的请求载荷是MIME格式的,然而百度迟迟找不到合适的方案,后得一高人相助,遂解,故此记录,以备遗忘。

1、正确的请求体

python请求中MIME格式的文件构造_本地文件

这里面值得注意的是,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字段,如果强制写了这个字段,则会构造失败。

随后抓包能够看到请求正常。