首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python multipart/form-data Post请求

Python multipart/form-data Post请求
EN

Stack Overflow用户
提问于 2019-12-02 16:14:15
回答 1查看 686关注 0票数 0

所以我一直在尝试发送一个multipart/form-data请求,但没有成功。在当前时刻,我得到的错误是请求的必需部分丢失。

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

我知道在请求中指定头部是不明智的,因为请求会处理这一点。但如果我不这样做,我会得到以下错误:

‘{’消息‘:’内容类型'‘不支持’,'httpStatus':'500 INTERNAL_SERVER_ERROR‘}’‘

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

这是我的python脚本:

代码语言:javascript
复制
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())

我将添加请求的头部:

代码语言:javascript
复制
< 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框架和postman中工作。所以我已经无计可施了。与此同时,我一直在寻找一种适用的解决方案。包括MultipartEncoder。这两种方法似乎都没有奏效。我假设困难在于formData的嵌套值。我遗漏了一些明显的东西。

EN

回答 1

Stack Overflow用户

发布于 2019-12-02 16:21:33

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

但是,它会出现在您的registrationMetadata数据字段中,即在内部字典两边包含单引号作为字符串的一部分。我想你可能想要的是:

代码语言:javascript
复制
data = {
   "registrationMetadata": {"firstName":"<name>","lastName":"<lastName>","mobileNumber":"<mobilenumber>","serialNumber":"1234","country":"BE","signingProfile":"sms","externalId":"<externalId>","email": "<email>","language": "nl"},
}

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

代码语言:javascript
复制
data = {
       "registrationMetadata": '{"firstName":"<name>","lastName":"<lastName>","mobileNumber":"<mobilenumber>","serialNumber":"1234","country":"BE","signingProfile":"sms","externalId":"<externalId>","email": "<email>","language": "nl"}',
    }

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

代码语言:javascript
复制
session = requests.session()
response = session.post(url, data=json.dumps(data), auth=auth, verify=False)

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

代码语言:javascript
复制
data = {
    "registrationMetadata": {
        "firstName": "<name>",
        "lastName": "<lastName>",
        "mobileNumber": "<mobilenumber>",
        "serialNumber": "1234", 
        "country": "BE", 
        "signingProfile": "sms", 
        "externalId": "<externalId>", 
        "email": "<email>", 
        "language": "nl",
    },
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59134873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档