我需要將如下所示的 JSON 物件傳遞給 REST API(請注意值中的轉義 " - 字串格式的 json)
{ "data": "{\"positionname\": \"API User\",\"person\": \"Paul\",}" }
在 POSTMAN 中,使用上面的 JSON 對 API 端點使用 POST 方法,我得到 200 并創建了一條記錄。當我嘗試使用“請求”從 Python Shell 執行相同操作時,它失敗了:
# JSON as string with proper escape
>>> data = '{"data": "{\\"positionname\\": \\"API User\\", \\"person\\": \\"Paul\\"}"}'
# Loads output removes backslashes
>>> json.loads(data)
{'data': '{"positionname": "API User", "person": "Paul"}'}
# Print output shows data -exactly- as I need to pass it to the API
# The string that print() provides is in the EXACT format that the API requires
# It needs " around data, and the escape \ character is needed.
>>> print (data)
{"data": "{\"positionname\": \"API User\", \"person\": \"Paul\"}"}
# Data still in original format...
>>> data
'{"data": "{\\"positionname\\": \\"API User\\", \\"person\\": \\"Paul\\"}"}'
# Try to pass the data to the API..
>>> response = apiRequest.post('http://apiURL/board/Input', data)
# It fails...
>>> response<Response [400]>
>>>
更新:
我能夠使用 POSTMAN 使用單引號添加記錄,如下所示。但是,當我在 Python 中嘗試時,“資料”鍵更改為“資料”(單引號)并且 API 需要雙引號:
# Now using single quotes in the JSON - sending this to POSTMAN works
>>> data = '{"data": "{\'positionname\': \'API User\', \'person\': \'X\'}"}'
# Data still looks great.
>>> data
'{"data": "{\'positionname\': \'API User\', \'person\': \'X\'}"}'
# But when I send to the API, I get an error saying that double-quotes are required at the first character - that was odd b/c they are - but when I do a json.loads() I see that the "data" is now 'data'
Error:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
>>> json.loads(data)
{'data': "{'positionname': 'API User', 'person': 'X'}"}
^^^ 為什么 'data' 是單引號,而值是 "{}" 雙引號?
uj5u.com熱心網友回復:
您的用例看起來很奇怪,但是如果您沒有找到任何令人滿意的解決方案,您可以嘗試此操作以獲得所需的輸出。
data = '{ "data": "{\\"positionname\\": \\"API User\\",\\"person\\": \\"Paul\\",}" }'
dataSplitted = data.split("\\")
output = ""
for word in dataSplitted:
output = "{}\{}".format(output, word)
output = output[1:]
uj5u.com熱心網友回復:
您不需要“捕獲” print();的輸出。你已經有了資料。
print()列印實際存在的實際資料,這與repr()以 Python 語法編碼的資料的呈現不同。
類似地,類似file.write(yourdata)或socket.send(yourdata)將發送該文字資料的呼叫,而不是其 Python 表示。
如果它在您的控制之下,則您用來生成字串的邏輯應如下所示:
content = { "positionname": "API User", "person": "Paul" }
wrapper = { "data": json.dumps(content) }
wrapper_json = json.dumps(wrapper)
...如果你print(wrapper_json),你會看到一些以完全正確的方式發送到你的服務的格式。
我們可以通過發布到公開可用的 pastebin 并檢索其回復來證明上述內容:
import requests, json, sys
position = "API User"
username = "Paul"
## FIXME: CHANGE THIS TO YOUR OWN PUBLIC REQUESTBIN INSTANCE
requestbin = 'https://enh4cydill4ac.x.pipedream.net'
content = { "positionname": position, "person": username }
wrapper = { "data": json.dumps(content) }
wrapper_json = json.dumps(wrapper)
response = requests.post(requestbin,
data=wrapper_json,
headers={"Content-Type": "application/json"})
向 requestbin 詢問這個請求的原始正文,它告訴我們客戶端發送到服務器的文本是:
{"data": "{\"positionname\": \"API User\", \"person\": \"Paul\"}"}
......這正是我們所期望的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333197.html
