2017-11-08 125 views
6

Testuję aplikację C#, która wysyła żądania do innego Rest API i chcę wyśmiać serwer. Znałem podstawowy python i zastanawiałem się, czy mogę napisać prosty serwer odpoczynku API bez angażowania się w duże frameworki takie jak Django. Byłby to prosty serwer, na którym dostaję json za pośrednictwem ciała żądania i muszę zwrócić inny json (z logiką powrotu wewnątrz, jak widok).Quick Rest API z Pythonem do kpienia z odpowiedzi

Pozdrawiam!

Coś prostego tak:

@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

@tutaj możesz również rzucić okiem na serwer JSON: https://github.com/typicode/json-server, który jest bardzo przydatny do wyśmiewania API. Zapewnia pełny zestaw czasowników HTTP, w tym GET, POST, PUT bez pojedynczego wiersza kodu! –

+2

@nico Zobacz także Flask: http://flask.pocoo.org/. Python tylko, martwy prosty w użyciu i zacząć! –

+0

Dlaczego serwer? Dlaczego po prostu nie sfałszować samej biblioteki żądań i całkowicie uniknąć połączeń sieciowych? –

Odpowiedz

3

W przypadku, gdy naprawdę nie chcesz używać żadnych zewnętrznych ram/bibliotek, można utworzyć prostą klasę, która rozciąga BaseHTTPRequestHandler, coś takiego:

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") 

a następnie uruchomić serwer lokalnie w porcie wyboru (domyślnie 80) po prostu tak:

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() 

i jeśli potrzebujesz na łatwe zarządzanie wiele tras, można użyć klein lub Flask microframeworks (lub nawet bottle), aby łatwiej i prościej dla ciebie proste minimalny przykład użycia za korzystanie klein będzie wyglądać mniej więcej tak:

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)) 

a następnie uruchomić serwer tak:

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

Ponadto, jeśli chcesz zdalnie i nie używać mock API tylko lokalnie, można użyć narzędzia tunelowania jak ngrok. Jest bardzo prosty i łatwy w użyciu.

+0

Tak, ale jak można na przykład powiązać/api/v1/somepath z tym GET? Typ zawartości BTW nie powinien być jsonem? – Nico

+0

pisał o tym, zobacz zaktualizowaną odpowiedź @Nico –

+0

Wygląda świetnie, nie wiedział o kleinie, Może również ustawić kod statusu w odpowiedzi? – Nico