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)
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? –
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+) –
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ế. –