簡體   English   中英

Python multipart/form-data Post 請求

[英]Python multipart/form-data Post Request

所以我一直在嘗試發送一個 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 的嵌套值。 而且我錯過了一些明顯的東西。

這是非常特定於此端點的,並且 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",
    },
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM