用于模拟响应的 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()
如果您需要轻松管理大量路由,您可以使用klein
或Flask
微框架(甚至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 调用