2013-07-30 15 views
10

Python requests私のWebの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) 

最もRESPのAPIドキュメントに記述されている標準的な方法であるため、コマンドラインで再現するcurlコマンドを構築することは、一般的な方法である、見ます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属性は、オブジェクトです。したがって、headersおよびbody属性を持ちます。本文は、-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

ありがとう、サンプルコードは今まで私にとっては十分です。実際に使用されています。 –

関連する問題