2017-06-08 18 views
-1

我有一個Python字典Python的請求字典的形式數據

x = {'id': 123, 'data': {'param1': 'hello', 'param2': 'world'}} 

我試圖讓我的表格數據是

id=123 
data[param1]=hello 
data[param2]=world 

不能將它作爲一個JSON ,因爲接收它的API不會接受json對象

我試過像這樣傳遞它

requests​.post(url, data=x, headers={'content-type': 'application/x-www-form-urlencoded'}) 

請求出去與表單數據看起來像這樣

id=123 
data=param1 
data=param2 

有沒有辦法來解決這個問題?

+0

[Python字典,以URL參數]的可能的複製(https://stackoverflow.com/questions/1233539/python-dictionary-to-url-parameters) – Tomalak

+0

@Tomalak號請再次閱讀問題 –

+0

你有沒有試過'data = x ['data']'? – zipa

回答

0

而不是發佈data = x你應該發佈data=x['data']。這應該可以解決你的問題。

requests​.post(url, data=x['data'], headers={'content-type': 'application/x-www-form-urlencoded'}) 

或者更好的辦法是從你的字典中刪除data鍵,直接創建字典作爲

x = {'param1': 'hello', 'param2': 'world'} 

然後你就可以發佈,如:

requests​.post(url, data=x['data'], headers={'content-type': 'application/x-www-form-urlencoded'}) 

選擇什麼效果最好爲你..

希望這會有所幫助:)

+0

我應該澄清,我的實際數據包含頂級的其他值,所以我不能這樣做 – Alon

+0

你能更清楚你的數據結構是什麼? – coderadi

+0

澄清在編輯 – Alon

-1

您可以拼合出的第一級:

x = {'data': {'param1': 'hello', 'param2': 'world'}} 

x_flattened = {"{}[{}]".format(e, s) if type(: x[e][s] for e in x for s in x[e]} 

requests​.post(url, data=x_flattened) 

編輯 - 你添加更多信息以在此期間的原始對象。如果您想保留頂層奇異的參數,以及,你可以在兩個步驟去做(你能做到單字典理解,但它很快變得難看):

x_flattened = {} 
for e in x: 
    if isinstance(x[e], (list, dict)): 
     x_flattened.update({"{}[{}]".format(e, s): x[e][s] for s in x[e]}) 
    else: 
     x_flattened[e] = x[e] 

requests​.post(url, data=x_flattened) 
+0

這是......不明智的。數據序列化不像一點點的字符串插值那麼簡單。如果數據包含引號或括號/大括號,則會中斷。除此之外,OP很可能正在尋找標準的URL編碼鍵/值對,就像請求的內容類型所表明的一樣。 – Tomalak

+0

我沒有說明這是明智的......'requests'模塊並沒有提供非易失性API的解決方法,這些API需要一些特殊的數據打包以滿足某些深不可測的原因。這是實現OP所需要的最基本的方式,因此讓他開始......他必須處理邊緣情況,或找到他想要與之通信的API的作者,並告訴他修正期望接收方。 – zwer

+0

「特殊數據包裝」和「application/x-www-form-urlencoded」在很大程度上是矛盾的。沒有什麼比URL編碼更特別的了。除此之外,「邊緣案例」對於不正確的代碼並不是一個好的防禦手段。 – Tomalak