python - 使用 Python 请求在单个请求中发送文件和 JSON

标签 python rest python-requests

我正在尝试 POST 到 API(使用 SlimPHP 构建),该 API 接受图像以及 JSON 形式的附加图像元数据。

我已经使用 REST 客户端工具验证了 AP​​I 可以正常工作,并且可以成功发布到服务。所有数据都正确存储。

我现在正在尝试使用 Python 进行 POST - 但是我的 JSON 数据似乎没有保存。

我的代码:

    data = {'key1': 'value1', 'key2': 'value2'}
    url = 'http://mydomain.com/api/endpoint'
    headers = {'Authorization': 'my-api-key'}
    files = {'file': (FILE, open(PATH, 'rb'), 'image/jpg', {'Expires': '0'})}
    r = requests.post(url, files=files, headers=headers, data=data)

--

我试图设置额外的标题,

即:/

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'multipart/form-data'}

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'application/json'}

这些会导致 500 错误。


2014 年 7 月 14 日更新:

使用 chrome 扩展(高级 Rest 客户端)我的 POST 是成功的 - 这是控制台显示为有效负载的内容:

------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="data"
test
------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
------WebKitFormBoundarysBpiwrA3hnGPUbMA--

我不太确定这意味着什么......

最佳答案

您的问题是您使用图像元数据作为要发布的键/值对的来源。而不是将其作为这些键/值对之一的值发送。

以下代码将发送一个与您提供的 curl 语句非常相似的请求:

url = 'my-url.com/api/endpoint'
headers = {'Authorization': 'my-api-key'}
image_metadata = {'key1': 'value1', 'key2': 'value2'}
data = {'name': 'image.jpg', 'data': json.dumps(image_metadata)}
files = {'file': (FILE, open(PATH, 'rb'), 'image/jpg', {'Expires': '0'})}
r = requests.post(url, files=files, headers=headers, data=data)

关于python - 使用 Python 请求在单个请求中发送文件和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642040/

相关文章:

python - 我怎样才能清理这个请求结果?

python - 如何打印从内部有字典的字典中提取信息的句子

python - 如何用 SHAP 值来解释我的部分预测? (并不是每一个预测)

python - 分布式 Mxnet 训练中权限被拒绝

rest - 在 REST API 中,DELETE 方法可以有参数吗?

Cygwin64 上的 Python 2.7.5 : requests installation fails

Python 访问 BaseRequestHandler

rest - 在使用 Auth0 的 golang 服务器中找出当前用户名

php - 用于 RESTful-API 中动态 DQL 的 Symfony2-Bundle

python - 使用 Beautiful Soup 和 Python 抓取 Asp.NET 网站