我正在尝试 POST 到 API(使用 SlimPHP 构建),该 API 接受图像以及 JSON 形式的附加图像元数据。
我已经使用 REST 客户端工具验证了 API 可以正常工作,并且可以成功发布到服务。所有数据都正确存储。
我现在正在尝试使用 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/