因此,我一直在尝试发送多部分/表单数据请求,但未成功。目前,我收到错误消息,要求的必需部分丢失了。
{'message': "Required request part 'registrationMetadata' is not present", 'httpStatus': '500 INTERNAL_SERVER_ERROR'}
我知道在请求中指定标头是不明智的,因为请求会处理这些问题。但是,如果我不收到以下错误:
'''{'message':“不支持内容类型”,'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的嵌套值。而且我缺少明显的东西。
答案 0 :(得分:1)
这是非常特定于此端点的,registrationMetadata不是该标准的一部分。因此,我的以下建议可能会产生影响,也可能不会产生影响,这实际上取决于服务器端,而我担心我们无法提供太多帮助。
但是,它将出现在您的registrationMetadata数据字段中,您正在将内部字典周围的单引号作为字符串的一部分。我想您可能会追求的是:
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",
},
}