python - 使用 Python 和使用请求的 API 的 multipart/form-data 问题
问题描述
我在尝试通过 multipart/form-data 上传文件时遇到问题。问题不在于请求/工具带,而是我正在使用的 API(是一个主要使用对名为 Mercado Libre 的特定平台的请求的 API,类似于 Ebay)。
我正在发布相关代码:
API的具体方法:
def post(self, path, body=None, params=None, extra_headers=None):
params = params or {}
headers = {'Accept': 'application/json', 'User-Agent':self.SDK_VERSION, 'Content-type':'application/json'}
if extra_headers:
headers.update(extra_headers)
uri = self.make_path(path)
if body:
body = json.dumps(body)
response = self._requests.post(uri, data=body, params=urlencode(params), headers=headers)
return response
我的代码:
from requests_toolbelt import MultipartEncoder
encoder = MultipartEncoder(
fields={
'file': (
'myfile.txt',
open('/tmp/myfile.txt', 'rb'),
'text/plain'
)
}
)
self.post(path='the-url-path', body=encoder, extra_headers={'Content-type': encoder.content_type})
当然这会给出一个错误,因为方法行:body = json.dumps(body):
TypeError:“MultipartEncoder”类型的对象不是 JSON 可序列化的
我做错了什么或如何解决这个问题?
提前致谢。
解决方案
您需要使用以下with
关键字对文件进行一些不同的操作:
from requests_toolbelt import MultipartEncoder
with open('/tmp/myfile.txt', 'rb') as f:
encoder = MultipartEncoder(
fields={
'file': (
'myfile.txt',
f,
'text/plain'
)
}
)
self.post(path='the-url-path', body=encoder, extra_headers={'Content-type': encoder.content_type})
推荐阅读
- java - 如何使用带有 Spring Boot 的 websockets 建立一对一的持久消息传递应用程序?
- android - 我可以在 Auto Linux BSP 上安装 adb 吗?
- nft - 不同的二进制代码集可以代表相似的数字信息吗?
- alias - 无服务器:在部署时,以前的别名在新部署时丢失
- ios - 有没有办法让 Appium 专注于 Safari 中的新窗口选项卡?
- delphi - 如何通过 Linux 平台在 Delphi 中链接目标文件?
- vba - 带有数组的VBA多列组合框
- r - “第一次适合 u 变量不起作用”在 R 中的分段包中
- react-native - 在 React Native 中模糊和变暗照片
- git - fork 一个 expo 模块以及如何维护它