2017-03-29 89 views
0

我正在研究一個python腳本,它將與我正在部署的CRM系統的API進行通信。我可以從CRM服務器獲取數據,但似乎無法添加(寫入)新條目。我懷疑我在做一些愚蠢的事情,因爲我對Python和編程一般都比較陌生,有人能指引我朝着正確的方向發展嗎?服務器不會拒絕數據,但它的行爲就像我從/api/v1.0/payments請求數據而不是發佈新數據一樣。Python 3 urlopen用法

from urllib.request import Request, urlopen 

headers = { 
    'Content-Type': 'application/json', 
    'X-Auth-App-Key': '[API key]' 
} 

values = b""" 
    { 
"clientId": 104, 
"method": 3, 
"checkNumber": "", 
"createdDate": "2016-09-12T00:00:00+0000", 
"amount": 40, 
"note": "", 
    } 
""" 

request = Request('http://[SERVER_URL]/api/v1.0/payments', data=values, headers=headers) 

response_body = urlopen(request).read() 
print(response_body) 

我基於從API文檔此示例代碼工作: http://docs.ucrm.apiary.io/#reference/payments/payments/post

我使用的urlopen正確的底部?

+0

你似乎不修改任何數據,只是要求和打印一些信息。你究竟想要做什麼?什麼錯誤信息(如果有的話),你會得到什麼? –

回答

0

This question/answer可能是您的問題。基本上你的POST請求被重定向到/api/v1.0/payments/(注意結尾的斜槓),當發生這種情況時,你的POST被重定向到GET請求,這就是服務器響應的原因,就像你試圖檢索所有付款信息。

其他需要注意的是你的json數據實際上是無效的,因爲它包含'note'值後面的尾部,,所以這也可能是一個問題。我想你也可能會錯過標頭中的Content-Length標題。我建議你使用json模塊來創建JSON數據:

values = json.dumps({ 
    "clientId": 104, 
    "method": 3, 
    "checkNumber": "", 
    "createdDate": "2016-09-12T00:00:00+0000", 
    "amount": 40, 
    "note": "" 
}) 

headers = { 
    'Content-Type': 'application/json', 
    'Content-Length': len(values), 
    'X-Auth-App-Key': '[API key]' 
} 

request = Request('http://[SERVER_URL]/api/v1.0/payments/', data=values, headers=headers) 
+0

感謝您的幫助。服務器實際上並未拒絕數據,它發送的響應與我試圖從/api/v1.0/payments中檢索信息(以json格式轉儲服務器上的所有現有支付信息)相同。 我想這可能是我正在使用的示例代碼的一個問題,但我想在我去平臺的論壇之前解決與我自己的代碼有關的任何問題。 使用json模塊只是最佳實踐,還是有我的代碼格式問題? – Detoxica

+0

我認爲這是最好的做法,但我對這個問題沒有權威。這當然更通用,因爲您可以輕鬆地使用python表達式來獲取對象鍵的值。只有你的代碼格式的問題是''note'中的尾隨逗號:「」,'。 – mshildt

+0

您在第一條評論中提供的額外信息應該放在主要問題中。它確實有助於描述您遇到的實際問題。查看我的更新到我的答案... – mshildt