我有一个请求,需要通过 python.requests 进行迁移。看起来像这样:
------WebKitFormBoundarSomeBoundary
Content-Disposition: form-data; name="input"; filename="blob"
Content-Type: application/json
{
some JSON
}
------WebKitFormBoundarySomeBoundary
Content-Disposition: form-data; name="file"; filename="contractFile.pdf"
Content-Type: application/pdf
------WebKitFormBoundarySomeBoundary--
我尝试通过 python.requests 导入它,但 API 总是有问题
我尝试了一些事情,例如:
url = {url}:{host}/{end_point}
multipart_data = MultipartEncoder(
fields={
'input': 'name',
'file': ('contractFile.pdf', open('contractFile.pdf', 'rb'), 'application/pdf')
}
)
r = requests.post(url, data=multipart_data, auth=('admin', 'admin'), headers={
'Content-Type': multipart_data.content_type})
收到错误 - “不支持内容类型应用程序/八位字节流”
url = {url}:{host}/{end_point}
files = {'file': (
'contractFile.pdf',
open('contractFile.pdf', 'rb'),
'application/pdf'
)}
payload = {'input': {'"name": "template20"'}}
json.dumps(list(payload))
r = requests.post(url, data=payload, auth=('admin', 'admin'), files=files)
print(r.text, '\n\n', r.headers['content-type'], '\n', r.headers['accept'])
这里同样的错误 - “不支持内容类型应用程序/八位字节流”
我不明白为什么我的内容类型是八位字节流,我检查标题,它甚至不在其中
我认为您的代码有一些可以改进的地方。
要使用 Python 的 requests 库正确发送包含 JSON 和 PDF 文件的 multipart/form-data 请求,您必须使用 requests_toolbelt 的 MultipartEncoder。这种方法允许您准确指定请求每个部分的内容类型:
application/json
表示 JSON 内容,application/pdf
表示文件。
请尝试这个解决方案:
import requests
from requests.auth import HTTPBasicAuth
from requests_toolbelt.multipart.encoder import MultipartEncoder
url = "http://{url}:{host}/{end_point}"
auth = HTTPBasicAuth('admin', 'admin')
# Prepare the JSON part
json_part_content = {
"some_key": "some_value"
# Include your actual JSON content here
}
# Prepare the multipart encoder with the appropriate content type for each part
multipart_data = MultipartEncoder(
fields={
'input': ('blob', json.dumps(json_part_content), 'application/json'),
'file': ('contractFile.pdf', open('contractFile.pdf', 'rb'), 'application/pdf')
}
)
response = requests.post(url, data=multipart_data, headers={'Content-Type': multipart_data.content_type}, auth=auth)
print(response.text)