2013-12-10 132 views
3

我不得不做出了一個Python HTTPS請求,我現在用的請求模塊,試圖讓我的生活更輕鬆。使用請求模塊創建Python HTTPS請求的正確方法?

請求需要有一個標題和3個FORM參數URL編碼。這是我在做什麼:

header = {'Content-type': 'application/x-www-form-urlencoded', 'Authorization':'Basic ' + encoded_string, 'Connection': 'Keep-Alive', 'Host':'host.host.com'} 

payload='grant_type=authorization_code&code=' + request.args['code'] + '&state=' + request.args['state'] + '&redirect_uri=http://xxx.xyz.com/request_listener' 

url = 'https://serviceprovider.xxx.com/auth/j_oauth_resolve_access_code' 

response = requests.post(url, data=payload, headers=header, verify=False) 

當我嘗試返回responsecontenttext,我得到一個空字符串。然而,當我打印的實際response對象,它說,這是一個<Response [200]>,但如果這實際上是一個200 OK,然後我張貼過的服務器應該去我指定的REDIRECT_URI,我會得到一個通知那裏。

這沒有發生,我對此感到困惑。

+0

http://docs.python.org/3/library/urllib.request.html#module-urllib.request –

+0

有些事情可以嘗試:使用'curl'手動構建請求,以確保您知道有效請求的內容應該是什麼。如果這有效,那麼你知道在Python中構建或傳遞請求的方式存在問題。將「有效載荷」構建爲字典而不是字符串。嘗試構建準備好的請求,以便在將請求發送到服務器之前檢查請求狀態。 –

回答

5

你的代碼與Requests庫相沖突:你自己在做很多東西,請求會爲你做。首先,不要自己對數據進行表單編碼,讓請求通過提供一個字典到data來完成,就像@ flyer的回答建議的一樣。

當您這樣做時,請求也將正確設置Content-Type標題,因此您不必這樣做。此外,請不要發送Connection標題:請求將爲您管理它。這同樣適用於Host標題:發送Host頭只可能會導致問題。

最後,不要自己設置授權標頭,讓請求通過提供認證憑證來完成。該慣用的請求代碼將是:

payload={ 
    'grant_type': 'authorization_code', 
    'code': request.args['code'], 
    'state': request.args['state'], 
    'redirect_uri': 'http://xxx.xyz.com/request_listener', 
} 

url = 'https://serviceprovider.xxx.com/auth/j_oauth_resolve_access_code' 

response = requests.post(url, data=payload, verify=False) 

如果這不起作用,那麼我會懷疑你的有效載荷數據是壞的。

+1

此外,OP可能認爲Host頭部在重定向時保留,而不是。 –

+0

我不得不在標頭中包含base64中的客戶端ID,所以我無法刪除它,但我刪除了其他所有內容。我確實將有效載荷數據更改爲字典,但即使請求失敗,我仍收到200 OK。我懷疑這個問題不是在那種情況下的請求。 – digerati32

+0

你怎麼知道請求失敗? – Lukasa

3

看來,有兩個錯誤。

第一招:
當你想要發佈的數據,數據的格式應該是這樣的:

payload={ 
    'grant_type': 'authorization_code', 
    'code': request.args['code'], 
    'state': request.args['state'], 
    'redirect_uri': 'http://xxx.xyz.com/request_listener', 
} 

第二:
Requests可以驗證自動HTTPS請求的SSL證書,並將它設置verify=True作爲默認值。您設置了verify=False,這意味着您要忽略ssl驗證。這可能不是你想要的。這裏是doc

+0

服務器證書有一個簽名問題,所以這就是爲什麼'verify'設置爲False。將有效負載更改爲字典會導致400錯誤:它表示請求在語法上不正確。 – digerati32

+0

@ digerati32,你可以給你想要請求的完整url嗎? – flyer