使用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
获取资源信息
(检索订单清单)
GET
获取资源信息
http://example.com/api/orders/123
(检索订单 #123)
POST
创建一个次的资源
(使用带数据的请求,创建一个新的订单)
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/
检索一个任务
POST
http://[hostname]/vhoneypot/v1/policy/
创建一个新任务
PUT
http://[hostname]/vhoneypot/v1/policy/
更新一个已存在的任务
DELETE
http://[hostname]/vhoneypot/v1/policy2/
删除一个任务
我们定义任务清单有以下字段:
- 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=)
View Code
然后是接口函数
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
View Code
大概就是这个样子。初学还求各位大神指点