2017-11-08 56 views
6

मैं एक सी # एप्लिकेशन का परीक्षण कर रहा हूं जो किसी अन्य रेस्ट एपीआई को अनुरोध करता है और मैं सर्वर को नकल करना चाहता हूं। मुझे मूल पायथन ज्ञात है और मैं सोच रहा था कि क्या मैं Django जैसे बड़े ढांचे के साथ शामिल किए बिना एक साधारण एपीआई रेस्ट सर्वर लिख सकता हूं। यह एक साधारण सर्वर होगा जहां मुझे अनुरोध निकाय के माध्यम से एक जेसन प्राप्त होता है और मुझे एक और जेसन (अंदर की वापसी के तर्क के साथ, एक दृश्य की तरह) वापस करना होगा।प्रतिक्रियाओं का मज़ाक उड़ाते हुए पाइथन के साथ त्वरित विश्राम API

सर्वश्रेष्ठ संबंध!

कुछ सरल इस तरह:

@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 आप JSON सर्वर पर भी एक नज़र डाल सकते हैं: https://github.com/typicode/json-server जो मैकिंग एपीआई के लिए बहुत आसान है। कोड की एक पंक्ति के बिना GET, POST, PUT सहित HTTP क्रियाओं का एक पूरा सेट प्रदान करता है! –

+2

@ एनिको फ्लास्क पर भी देखें: http://flask.pocoo.org/। इसका अजगर केवल उपयोग करने के लिए आसान और शुरू हो गया! –

+0

सर्वर क्यों? क्यों न सिर्फ अनुरोध पुस्तकालय का नकल करें और नेटवर्क कनेक्टिविटी से पूरी तरह से बचें? –

उत्तर

3

मामले में आप वास्तव में किसी भी बाहरी चौखटे/पुस्तकालयों का उपयोग नहीं करना चाहते हैं, तो आप एक साधारण वर्ग जो BaseHTTPRequestHandler फैली बना सकते हैं, कुछ इस तरह:

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

और फिर अपनी पसंद (80 डिफ़ॉल्ट रूप से) के बंदरगाह पर स्थानीय रूप से सर्वर प्रारंभ बस इस तरह:

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

और अगर आप आसानी से मार्गों के बहुत सारे का प्रबंधन करने की जरूरत है, आप इसे आसान और आप के लिए सरल बनाने के लिए klein या Flask microframeworks (या यहां तक ​​bottle) का उपयोग कर सकते हैं, klein प्रयोग करने के लिए एक सरल कम से कम उपयोग का उदाहरण कुछ इस तरह दिखेगा:

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

और उसके बाद इस तरह सर्वर चलाते:

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

इसके अलावा, आप सिर्फ स्थानीय स्तर पर दूर से और नहीं नकली API का उपयोग करने के लिए, आप ngrok तरह सुरंग उपकरणों का उपयोग कर सकते हैं करना चाहते हैं। यह बहुत आसान और उपयोग करने में आसान है।

+0

हाँ, लेकिन उदाहरण के लिए आप जीआईटी/एपीआई/वी 1/कुछपथ कैसे बांधते हैं? बीटीडब्ल्यू सामग्री प्रकार जेसन नहीं होना चाहिए? – Nico

+0

इसके बारे में लिख रहा था, अद्यतन उत्तर @Nico –

+0

देखें यह बहुत अच्छा लगता है, क्लेन के बारे में नहीं पता था, प्रतिक्रिया में स्थिति कोड भी सेट कर सकता है? – Nico

संबंधित मुद्दे

 संबंधित मुद्दे