用于模拟响应的 Python Quick Rest API

Posted

技术标签:

【中文标题】用于模拟响应的 Python Quick Rest API【英文标题】:Quick Rest API with Python for mocking responses 【发布时间】:2018-04-21 10:43:48 【问题描述】:

我正在测试一个向另一个 Rest API 发出请求的 C# 应用程序,并且我想模拟服务器。我知道基本的 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

【问题讨论】:

@nice 你也可以看看 JSON Server:github.com/typicode/json-server,它在模拟 API 时非常方便。提供一整套 HTTP 动词,包括 GET、POST、PUT,无需一行代码! @nico 也看看 Flask:flask.pocoo.org。它只有 python,使用起来非常简单! 为什么是服务器?为什么不直接模拟请求库本身并完全避免网络连接? @MartijnPieters 需要在 C# 程序中进行模拟吗? 是的:msdn.microsoft.com/en-gb/library/ff650441.aspx 【参考方案1】:

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

如果您需要轻松管理大量路由,您可以使用kleinFlask 微框架(甚至bottle)让您更轻松、更简单,这是使用@987654332 的简单最小用法示例@ 看起来像这样:

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 这样的隧道工具。它非常简单易用。

【讨论】:

是的,但是例如如何将 /api/v1/somepath 与该 GET 绑定? BTW 内容类型不应该是 json? 看起来不错,不知道klein,可能还会在响应中设置状态码? @Nico 是的! request.setResponseCode(200) 就是这样,默认发送200 伟大的 Ashish,ASAIC 我要测试这个! @Nico,你可能会发现this很有用,它是klein的详细文档。

以上是关于用于模拟响应的 Python Quick Rest API的主要内容,如果未能解决你的问题,请参考以下文章

[Spring boot] A quick REST API Guide

Spring Rest Service 不适用于 XML 响应

用于 Android 客户端的 Django Rest Framework 响应的通用 JSON 格式

使用 SpringBoot 配置文件模拟 REST API 调用

使用python将Rest Api json结果转换为csv

windows平台解决quick3.5final + sublimeText3 模拟器找不到的问题