如何使用Python中的requests库POST multipart/form-data?

3

我目前正在一个项目中工作,需要发布以下请求:

curl -X POST "http://localhost:8000/api/v1/recognition/recognize" \
-H "Content-Type: multipart/form-data" \
-H "x-api-key: xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxx" \
-F "file=@<image>.jpg"  #image

尝试多次使用此代码片段,但没有成功:
import requests
headers = {
    'Content-Type': 'multipart/form-data',
    'x-api-key': 'xxxxxxxxxxxx',
}
files = {
    'file': ('image.jpg', open('image.jpg', 'rb')),
}
response = requests.post('http://localhost:8000/api/v1/recognition/recognize', headers=headers, files=files)
print(response)

我做错了什么或者遗漏了什么吗?

似乎上面的内容是正确的,在发布后进行了编辑? - serv-inc
3个回答

3

try with this

import requests

headers = {
    'Content-Type': 'multipart/form-data',
    'x-api-key': 'xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxx',
}

files = {
    'file': ('<image>.jpg', open('<image>.jpg', 'rb')),
}

response = requests.post('http://localhost:8000/api/v1/recognition/recognize', headers=headers, files=files)

它返回 <Response [400]>。 - Javokhir169
嗯,你能否更新一下你的问题并附上你尝试的确切代码片段?正如你所看到的,还有一个几乎相同的代码答案。这就是你的curl正在做的事情。 - buran
Edited in my initial question - Javokhir169

2
我用这段代码使它工作了:

import requests
url = "http://10.0.38.119:8000/api/v1/recognition/recognize"
payload = {}
files = [('file', ('<image>.jpg', open('<image>.jpg', 'rb'), 'image/jpeg'))]
headers = {
  'x-api-key': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx'
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)

1
你没有设置边界吗?请求如何设置多部分请求非常黑盒子。 - vladimir.gorea
设置调试日志并比较在标头中显式设置Content-Type和不设置之间的区别后,我发现当我没有设置时,请求会自动设置边界。设置调试日志import http.client as http_client http_client.HTTPConnection.debuglevel = 1 - Tyler Seader

1
“-H”标志表示您正在传递一个头部而不是文件。
>>> import requests
>>> 
>>> headers = {
...     "Content-Type": "multipart/form-data",
...     "x-api-key": "xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxx"
... }
>>> 
>>> file = {"file": ("<image>.jpg", open("<image>.jpg", "rb"))}
>>> 
>>> r = requests.post("http://localhost:8000/api/v1/recognition/recognize",
...     headers=headers, files=file
... )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接