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

Sim*_*mon 9 python rest python-requests

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

我已经使用REST客户端工具验证了API是否正常工作,并且可以成功POST到服务.所有数据都正确存储.

我现在正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

-

我试图设置额外的标题,

即:/

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'multipart/form-data'}
Run Code Online (Sandbox Code Playgroud)

要么

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'application/json'}
Run Code Online (Sandbox Code Playgroud)

这导致500错误.


更新2014年7月14日:

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

------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="data"
test
------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
------WebKitFormBoundarysBpiwrA3hnGPUbMA--
Run Code Online (Sandbox Code Playgroud)

我不太清楚这意味着什么......

Jer*_*len 16

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

以下代码将发送一个请求,就像您提供的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)
Run Code Online (Sandbox Code Playgroud)

  • 嗨,杰里米。你能解释一下 FILE 变量代表什么吗?尝试对我的代码使用类似的解决方案 (2认同)