2013-07-30 7 views
10

Python requests là một mô-đun tốt để giảm bớt chương trình truy cập API web REST của tôi, tôi thường làm như dưới đâylàm thế nào để xây dựng lệnh curl từ mô-đun yêu cầu python?

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) 

Và khi có lỗi đi ra, tôi muốn nhìn thấy những gì xảy ra đằng sau nó. Xây dựng các lệnh curl để tái tạo trong dòng lệnh là cách phổ biến, vì đây là cách tiêu chuẩn được mô tả hầu hết trong tài liệu RESP API

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) 

Nó sẽ được tốt đẹp tôi có thể tạo ra curl mẫu lệnh cho yêu cầu này, xem ví dụ tốt trong libcloud's debug, tôi không thể tìm thấy một cách đơn giản để xây dựng, bên dưới là phương pháp tôi muốn tạo bởi chính tôi.

# 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 

Nó cũng sẽ được tốt đẹp nếu chúng ta có phương pháp trong requests đã


Dưới đây là giải pháp cuối cùng có được câu trả lời, làm việc cho tôi. Hiển thị nó ở đây để bạn tham khảo

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)  

Trả lời

18

Phương pháp này tồn tại trong một thời gian nhưng không liên quan đến mô-đun từ xa. Bạn có thể tạo một hàm nhận phản hồi và kiểm tra thuộc tính request của nó.

Thuộc tính request là đối tượng PreparedRequest để đối tượng có thuộc tính headersbody. Cơ thể là những gì bạn vượt qua để cuộn tròn với -d và các tiêu đề có thể được tạo như bạn đã làm ở trên. Cuối cùng, bạn sẽ muốn loại bỏ thuộc tính url từ đối tượng request và gửi đi. Các móc không quan trọng với bạn trừ khi bạn đang làm điều gì đó với một trình xử lý xác thực tùy chỉnh.

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) 

Điều đó nên hoạt động. Dữ liệu của bạn sẽ được định dạng đúng cho dù đó là multipart/form-data hay bất kỳ thứ gì khác.

+0

cảm ơn, đây là những gì tôi muốn làm trong mã mẫu, nhưng nó trở nên phức tạp, vì tôi cần xử lý loại dữ liệu khác nhau, tiêu đề [tiêu đề] ở trên có thể là số nguyên như, u có thể dán mã mẫu của bạn tôi tham khảo? –

+0

Nếu bạn đang chuyển số nguyên cho các yêu cầu và không nhận được ngoại lệ, tôi không biết bạn đang làm gì. Tôi có thể đặt một số mã ví dụ vào câu trả lời của tôi mặc dù và nó sẽ làm việc trên các phiên bản python yêu cầu làm việc trên (tức là 2.6+) –

+0

Cảm ơn, mã mẫu của bạn là đủ tốt cho tôi cho đến nay, và tôi cập nhật các câu hỏi với các mã tôi được sử dụng trong thực tế. –