2017-11-08 15 views
6

Tôi đang thử nghiệm một ứng dụng C# yêu cầu một API Rest khác và tôi muốn giả lập máy chủ. Tôi biết python cơ bản và tôi đã tự hỏi nếu tôi có thể viết một máy chủ API Rest đơn giản mà không được tham gia với các khuôn khổ lớn như Django. Nó sẽ là một máy chủ đơn giản, nơi tôi nhận được một json thông qua cơ thể yêu cầu và tôi phải trả lại một json (với logic của sự trở lại bên trong, giống như một cái nhìn).API Quick Rest với Python để trả lời mô phỏng

Trân trọng!

Something đơn giản như thế này:

@path(/api/v1/somepath, GET) 
def my_function(request): 
    json_input = request.body.json() 

    # My logic here 
    response.status = 200 
    response.body = {'some_field': 'something'} 
    return response 
+0

@nice, bạn cũng có thể xem xét Máy chủ JSON: https://github.com/typicode/json-server vốn rất tiện dụng cho các API giả mạo. Cung cấp một bộ hoàn chỉnh các động từ HTTP, bao gồm GET, POST, PUT mà không có một dòng mã! –

+2

@nico Cũng xem Flask: http://flask.pocoo.org/. Con trăn của nó chỉ, chết đơn giản để sử dụng và bắt đầu! –

+0

Tại sao lại là máy chủ? Tại sao không chỉ giả lập thư viện yêu cầu và tránh hoàn toàn kết nối mạng? –

Trả lời

3

Trong trường hợp bạn thực sự không muốn sử dụng bất kỳ khuôn khổ bên ngoài/thư viện, bạn có thể tạo một lớp đơn giản kéo dài BaseHTTPRequestHandler, một cái gì đó như thế này:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import json 

class S(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'application/json') 
     self.end_headers() 

    def do_GET(self): 
     self._set_headers() 
     self.data_string = self.rfile.read(int(self.headers['Content-Length'])) 

     self.send_response(200) 
     self.end_headers() 

     data = json.loads(self.data_string) 
     # your processing 
     outJson = {"success": True} 
     self.wfile.write(json.dumps(outJson)) 

    def do_HEAD(self): 
     self._set_headers() 
     self.wfile.write("HEAD") 

    def do_POST(self): 
     self._set_headers() 
     self.wfile.write("POST") 

và sau đó khởi động máy chủ cục bộ tại cảng của sự lựa chọn của bạn (80 theo mặc định) chỉ đơn giản như thế này:

def run(port=80): 
    httpd = HTTPServer(('', port), S) 
    print 'Starting httpd...' 
    httpd.serve_forever() 

if __name__ == "__main__": 
    from sys import argv 
    if len(argv) == 2: 
     run(port=int(argv[1])) 
    else: 
     run() 

và nếu bạn cần phải quản lý rất nhiều các tuyến đường một cách dễ dàng, bạn có thể sử dụng klein hoặc Flask microframeworks (hoặc thậm chí bottle) để làm cho nó dễ dàng hơn và đơn giản hơn cho bạn, đơn giản tối thiểu ví dụ sử dụng cho việc sử dụng klein sẽ giống như thế này:

import json 
from klein import Klein 

class ItemStore(object): 
    app = Klein() 

    def __init__(self): 
     self._items = {} 

    @app.route('/') 
    def items(self, request): 
     request.setHeader('Content-Type', 'application/json') 
     return json.dumps(self._items) 

    @app.route('/<string:name>', methods=['PUT']) 
    def save_item(self, request, name): 
     request.setHeader('Content-Type', 'application/json') 
     body = json.loads(request.content.read()) 
     self._items[name] = body 
     return json.dumps({'success': True}) 

    @app.route('/<string:name>', methods=['GET']) 
    def get_item(self, request, name): 
     request.setHeader('Content-Type', 'application/json') 
     return json.dumps(self._items.get(name)) 

và sau đó chạy các máy chủ như thế này:

if __name__ == '__main__': 
    store = ItemStore() 
    store.app.run('localhost', 8080) 

Ngoài ra, nếu bạn muốn sử dụng apis giả từ xa và không chỉ tại địa phương, bạn có thể sử dụng các công cụ đào hầm như ngrok. Nó khá đơn giản và dễ sử dụng.

+0

Vâng, nhưng làm thế nào để bạn ràng buộc/api/v1/somepath với GET chẳng hạn? Loại nội dung BTW không nên là json? – Nico

+0

đã viết về nó, hãy xem câu trả lời cập nhật @Nico –

+0

Có vẻ tuyệt vời, không biết về klein, May cũng có thể đặt mã trạng thái trong phản hồi không? – Nico

Các vấn đề liên quan