2017-07-18 153 views
0

我想調用python上的CURL API。在Python上調用Curl API

curl -X POST -H "Authorization:Token 00d2e3a10c82420414b2d36d28fb5afc2cd8e8a5" \ 
-H "Content-Type: application/json" \ 
-d '{"module_id":"[MODULE_ID]", "text": "example text"}' \ 
-D - \ 
https://api.tocall.com/ 

我用requests模塊用於製備請求和json模塊,用於將對象到字符串。但我越來越404.

我在哪裏錯了?

import requests 
import json 
headers = { 
    'Authorization': 'Token 00d2e3a10c82420414b2d36d28fb5afc2cd8e8a5', 
    'Content-Type': 'application/json', 
} 
url = "https://api.tocall.com/" 
data = '{"module_id":"[MODULE_ID]", "text": "example text"}' 
response= requests.post(url, data=json.dumps(data), headers=headers) 
print(response.status_code) 

回答

0

添加Host頭,所以最終的服務器知道哪個虛擬主機將請求路由,

變化:

headers = { 
    'Authorization': 'Token 00d2e3a10c82420414b2d36d28fb5afc2cd8e8a5', 
    'Content-Type': 'application/json', 
} 

爲:

headers = { 
    'Authorization': 'Token 00d2e3a10c82420414b2d36d28fb5afc2cd8e8a5', 
    'Content-Type': 'application/json', 
    'Host' : 'api.tocall.com' 
} 

我認爲這將解決您的問題。最終,您可能想要更新默認標題,而不是製作自己的標題。嘗試使用requestssession features執行一致的查詢。

注意:正如其他答案所述,您還有其他JSON編碼問題,但這不是您得到404的原因。

0

您正在將數據編碼爲JSON兩次。 json.dumps()需要一個對象並轉換爲JSON。在這種情況下,您正在將字符串轉換爲JSON。這應該更好的工作:

import requests 
headers = { 
    'Authorization': 'Token 00d2e3a10c82420414b2d36d28fb5afc2cd8e8a5', 
} 
url = "https://api.tocall.com/" 
data = {"module_id":"[MODULE_ID]", "text": "example text"} 
response= requests.post(url, json=data, headers=headers) 
print(response.status_code) 

如果仍然無法正常工作,你需要更多的幫助,你應該包括你的API,以便我們能夠重現問題真正的細節。

+0

這當然是* a *問題,但我不確定有效載荷是否會導致404錯誤。 – chepner

+0

我已經看到API根據POST數據返回404。也許它期望有一些沒有找到的標識符。隨着提供的信息量和選擇信任在這兩種情況下使用相同的URL,這是我最好的猜測。 – kichik

0

json.dumps將一個Python dict變成一個字符串,但你的data已經是一個字符串。最簡單的做法是將data作爲dict,然後使用json.dumps

+0

評論中最受歡迎的短評和無評論的答案。 – Fabien

+0

它解決了這個問題;爲什麼我應該重寫OP的所有代碼? – jackarms

+0

答案的質量。你引用他,你顯示修復。通過閱讀你,沒有人需要閱讀OP。或不。 – Fabien