使用python的Flask实现一个RESTful API服务器端
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了。
本文将会使用python的Flask框架轻松实现一个RESTful的服务。
REST的六个特性:
- Client-Server:服务器端与客户端分离。
- Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。
- Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。
- Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。
- Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。
- Code on demand(按需执行代码?):服务器端可以在上下文中执行代码或者脚本?
Servers can provide executable code or scripts for clients to execute in their context. This constraint is the only one that is optional.(没看明白)
RESTful web service的样子
REST架构就是为了HTTP协议设计的。RESTful web services的核心概念是管理资源。资源是由URIs来表示,客户端使用HTTP当中的'POST, OPTIONS, GET, PUT, DELETE'等方法发送请求到服务器,改变相应的资源状态。
HTTP请求方法通常也十分合适去描述操作资源的动作:
HTTP方法 | 动作 | 例子 |
GET | 获取资源信息 |
http://example.com/api/orders (检索订单清单) |
GET | 获取资源信息 |
http://example.com/api/orders/123 (检索订单 #123) |
POST | 创建一个次的资源 |
http://example.com/api/orders (使用带数据的请求,创建一个新的订单) |
PUT | 更新一个资源 |
http://example.com/api/orders/123 (使用带数据的请求,更新#123订单) |
DELETE | 删除一个资源 |
http://example.com/api/orders/123 删除订单#123 |
REST请求并不需要特定的数据格式,通常使用JSON作为请求体,或者URL的查询参数的一部份。
设计一个简单的web service
下面的任务将会练习设计以REST准则为指引,通过不同的请求方法操作资源,标识资源的例子。
我们将写一个To Do List 应用,并且设计一个web service。第一步,规划一个根URL,例如:
http://[hostname]/todo/api/v1.0/
上面的URL包括了应用程序的名称、API版本,这是十分有用的,既提供了命名空间的划分,同时又与其它系统区分开来。版本号在升级新特性时十分有用,当一个新功能特性增加在新版本下面时,并不影响旧版本。
第二步,规划资源的URL,这个例子十分简单,只有任务清单。
规划如下:
HTTP方法 | URI | 动作 |
GET | http://[hostname]/vhoneypot/v1/policy | 检索任务清单 |
GET | http://[hostname]/vhoneypot/v1/policy/<uuid> | 检索一个任务 |
POST | http://[hostname]/vhoneypot/v1/policy/<uuid> | 创建一个新任务 |
PUT | http://[hostname]/vhoneypot/v1/policy/<uuid> | 更新一个已存在的任务 |
DELETE | http://[hostname]/vhoneypot/v1/policy2/<id> | 删除一个任务 |
我们定义任务清单有以下字段:
- id:唯一标识。整型。
- title:简短的任务描述。字符串型。
- description:完整的任务描述。文本型。
- done:任务完成状态。布尔值型。
以上基本完成了设计部份,接下来我们将会实现它!
from flask import Flask from flask_restful import Api app = Flask(__name__) app.config.update(RESTFUL_JSON=dict(ensure_ascii=False)) api = Api(app) from IPolicy import IPolicyList, IPolicy, IPolicy2List, IPolicy2 api.add_resource(IPolicyList, '/vhoneypot/v1/policy') api.add_resource(IPolicy, '/vhoneypot/v1/policy/<uuid>') api.add_resource(IPolicy2List, '/vhoneypot/v1/policy2') api.add_resource(IPolicy2, '/vhoneypot/v1/policy2/<id>') def main(argv): app.run(host=, port=, debug=)
然后是接口函数
1 class IPolicyList(HIHTTP.Resource): 2 # 获取历史策略信息和详情数据或者满足条件的数据 3 def get(self): 4 pass 5 6 7 8 class IPolicy(HIHTTP.Resource): 9 def get(self, uuid): 10 pass 11 12 13 14 class IPolicy2List(HIHTTP.Resource): 15 def get(self): 16 pass 17 18 def post(self): 19 pass 20 21 22 class IPolicy2(HIHTTP.Resource): 23 24 25 def put(self, id): 26 pass 27 28 29 def delete(self, id): 30 pass 31