2013-07-30 70 views
10

Python requests是一個很好的模塊,以減輕我的網絡REST API訪問編程,我通常不喜歡下面如何構建來自python請求模塊的curl命令?

import json 
url = 'https://api.github.com/some/endpoint' 
payload = {'some': 'data'} 
headers = {'Content-type': 'application/json', 'Accept': 'application/json'} 

r = requests.post(url, data=json.dumps(payload), headers=headers) 

當有錯誤出現,我想看看它後面發生什麼。構建curl命令在命令行再現是常見的方式,因爲這是

try: 
    r = requests.post(url, data=json.dumps(payload), headers=headers) 
except Exception as ex: 
    print "try to use curl command below to reproduce" 
    print curl_request(url,"POST",headers,payload) 

這將是很好我可以生成此請求curl命令樣品,其最在RESP API文獻中描述的標準方法,參見在libcloud's debug中很好的例子,我找不到一個簡單的方法來構建,下面是我想自己創建的方法。

# below code is just pseudo code, not correct 
def curl_request(url,method,headers,payloads): 
    # construct curl sample from requests' structure 
    # $ curl -v -H "Accept: application/json" -H "Content-type: application/json" 
    # -d '{"some":"data"}' 
    # -X POST https://api.github.com/some/endpoint 
    request = "curl -v " 
    for header in headers: 
     print header 
     request = request + '-H "' + header + ": " + headers[header] + '" ' 
    for payload in payloads: 
     request = request + '-d {} "' + payload + ": " + payloads[payload] + '" '   
    request = request + "-X %s %s" % (method,url) 
    return request 

這也將是很好,如果我們在requests有方法已經


下面是最終的解決方案得到了答案,我的作品。在此處顯示以供參考

def curl_request(url,method,headers,payloads): 
    # construct the curl command from request 
    command = "curl -v -H {headers} {data} -X {method} {uri}" 
    data = "" 
    if payloads: 
     payload_list = ['"{0}":"{1}"'.format(k,v) for k,v in payloads.items()] 
     data = " -d '{" + ", ".join(payload_list) + "}'" 
    header_list = ['"{0}: {1}"'.format(k, v) for k, v in headers.items()] 
    header = " -H ".join(header_list) 
    print command.format(method=method, headers=header, data=data, uri=url)  

回答

18

此方法存在於請求中,但與遠程模塊遠沒有關係。您可以創建一個函數來獲取響應並檢查其屬性request

request屬性是PreparedRequest對象,所以它具有headersbody屬性。正文是你通過與-d捲曲並且可以像上面那樣生成標題。最後,您需要從request對象中摘取url屬性併發送該屬性。除非你使用自定義身份驗證處理程序進行操作,否則鉤子對你無關緊要。

req = response.request 

command = "curl -X {method} -H {headers} -d '{data}' '{uri}'" 
method = req.method 
uri = req.url 
data = req.body 
headers = ['"{0}: {1}"'.format(k, v) for k, v in req.headers.items()] 
headers = " -H ".join(headers) 
return command.format(method=method, headers=headers, data=data, uri=uri) 

應該工作。您的數據將被格式化爲multipart/form-data或其他任何內容。

+0

謝謝,這是我想要在示例代碼中做的事情,但它變得很複雜,因爲我需要處理不同類型的數據,上面的頭[頭]可能是整數,你可以粘貼你的示例代碼我參考? –

+0

如果你將整數傳遞給請求而沒有得到異常,我不知道你在做什麼。我可以在我的答案中加入一些示例代碼,它可以在需要工作的python版本上工作(即2.6+) –

+0

謝謝,您的示例代碼對我來說已經足夠好了,並且我使用代碼I在現實中使用。 –

相關問題