如何使用 JSON 和文件发送“表单数据”请求

问题描述 投票:0回答:1

我有一个请求,需要通过 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 python-3.x python-requests multipartform-data form-data
1个回答
0
投票

我认为您的代码有一些可以改进的地方。

要使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.