【问题标题】:Python multipart/form-data Post RequestPython multipart/form-data 发布请求
【发布时间】:2019-12-02 08:14:14
【问题描述】:

所以我一直在尝试发送 multipart/form-data 请求,但未成功。目前,我收到了请求的必需部分丢失的错误消息。

{'message': "Required request part 'registrationMetadata' is not present", 'httpStatus': '500 INTERNAL_SERVER_ERROR'}

我知道在请求中指定标头是不明智的,因为 Requests 会处理这些问题。但如果我不这样做,我会收到以下错误:

'''{'message': "Content type '' not supported", 'httpStatus': '500 INTERNAL_SERVER_ERROR'}'''

对于此应用程序,禁用警告和 verify=false 并不重要,因为外部世界无法访问它。

这是我的 python 脚本:

import requests
from requests_toolbelt.utils import dump

import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = "<ValidUrl>"
data = {"registrationMetadata": '{"firstName":"<name>","lastName":"<lastName>","mobileNumber":"<mobilenumber>","serialNumber":"1234","country":"BE","signingProfile":"sms","externalId":"<externalId>","email": "<email>","language": "nl"}'}
headers = {'Content-Type': 'multipart/form-data; boundary=ebf9f03029db4c2799ae16b5428b06bd'}
auth = ('<username>', '<password>')

session = requests.session()
response = session.post(url, data=str(data), auth=auth, verify=False)

req_dump = dump.dump_all(response)
print(req_dump.decode('utf-8'))

print(response.request.body)
print(response.json())

我将添加请求的标头:

< POST <valid url> HTTP/1.1
< Host: <valid host>
< User-Agent: python-requests/2.22.0
< Accept-Encoding: gzip, deflate
< Accept: */*
< Connection: keep-alive
< Content-Type: multipart/form-data; boundary=ebf9f03029db4c2799ae16b5428b06bd
< Content-Length: 237
< Authorization: Basic <valid auth key>==

该请求在我们的 java 框架和邮递员中工作。所以我束手无策。与此同时,我一直在寻找适用的解决方案。包括 MultipartEncoder。两者似乎都没有奏效。我假设困难在于 formData 的嵌套值。而且我遗漏了一些明显的东西。

【问题讨论】:

    标签: python python-requests multipartform-data


    【解决方案1】:

    这是非常特定于该端点的,registrationMetadata 不是标准的一部分。所以我下面的建议可能会产生影响,也可能不会,这真的取决于服务器端,如果没有看到我们恐怕根本无法提供太多帮助。

    但是,它会出现在您的registrationMetadata 数据字段中,您在inner-dict 周围包含单引号作为字符串的一部分。我认为你可能会追求的是:

    data = {
       "registrationMetadata": {"firstName":"<name>","lastName":"<lastName>","mobileNumber":"<mobilenumber>","serialNumber":"1234","country":"BE","signingProfile":"sms","externalId":"<externalId>","email": "<email>","language": "nl"},
    }
    

    而不是你在做什么,就是这样:

    data = {
           "registrationMetadata": '{"firstName":"<name>","lastName":"<lastName>","mobileNumber":"<mobilenumber>","serialNumber":"1234","country":"BE","signingProfile":"sms","externalId":"<externalId>","email": "<email>","language": "nl"}',
        }
    

    您还应该使用“json”库,而不是在请求中转换为字符串类型。仅将其更改为字符串可能还不够。

    session = requests.session()
    response = session.post(url, data=json.dumps(data), auth=auth, verify=False)
    

    编辑:我发现真正有助于消除此类问题的是跨多行定义我的字典,示例如下:

    data = {
        "registrationMetadata": {
            "firstName": "<name>",
            "lastName": "<lastName>",
            "mobileNumber": "<mobilenumber>",
            "serialNumber": "1234", 
            "country": "BE", 
            "signingProfile": "sms", 
            "externalId": "<externalId>", 
            "email": "<email>", 
            "language": "nl",
        },
    }
    

    【讨论】:

    • 感谢您非常详细的回答。可悲的是,正如您所料,这没有产生任何结果。我意识到这是非常具体的事情。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多