使用Python的Quick Rest API用于模拟响应

Nic*_*ico 6 python api rest json python-3.x

我正在测试一个C#应用程序,它向另一个Rest API发出请求,我想模拟服务器.我知道基本的python,我想知道我是否可以编写一个简单的API Rest服务器而不涉及像Django这样的大型框架.这将是一个简单的服务器,我通过请求体接收一个json,我必须返回另一个json(内部返回的逻辑,就像一个视图).

最好的祝福!

像这样简单:

@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
Run Code Online (Sandbox Code Playgroud)

Ash*_*jan 6

如果您真的不想使用任何外部框架/库,您可以创建一个扩展的简单类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")
Run Code Online (Sandbox Code Playgroud)

然后在您选择的端口(默认为 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()
Run Code Online (Sandbox Code Playgroud)

如果您需要轻松管理大量路由,您可以使用kleinFlask微框架(甚至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))
Run Code Online (Sandbox Code Playgroud)

然后像这样运行服务器:

if __name__ == '__main__':
    store = ItemStore()
    store.app.run('localhost', 8080)
Run Code Online (Sandbox Code Playgroud)

此外,如果您想远程使用模拟 apis 而不仅仅是本地,您可以使用像ngrok这样的隧道工具。它非常简单且易于使用。