这篇文章是自己的学习总结,阅读顺序如下
- API的理解
- RESTful API
- 使用Flask 实现RESTful API
- 学习积累
**
API的理解
**
API(application programming interfaces),即应用程序编程接口。API由服务器(Server)提供(服务器有各种各样的类型,一般我们浏览网页用到的是web server,即网络服务器),通过API,计算机可以读取、编辑网站数据,就像人类可以加载网页、提交信息等。通俗地,API可以理解为家用电器的插头,用户只提供插座,并执行将插头插入插座的行为,不需要考虑电器内部如何运作。从另外一个角度上讲API是一套协议,规定了与外界的沟通方式:如何发送请求和接受响应。
RESTful API
RESTful API即满足RESTful风格设计的API,RESTful表示的是一种互联网软件架构(以网络为基础的应用软件的架构设计),如果一个架构符合REST原则,就称它为RESTful架构。RESTful架构的特点:
每一个URI代表一种资源;
客户端和服务器之间,传递这种资源的某种表现层;把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
客户端通过四个HTTP动词,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
使用Flask实现RESTful API
使用python实现restful接口主要有两种方法:1.直接使用falsk 2.使用flask插件flaskrestful。直接使用flask主要是使用装饰器定义路由,需要定义http方法,详情参见,Flask-RESTful 是一个可以简化 APIs 的构建的 Flask 扩展。
本文主要实现使用flask插件Flask-RESTful实现restful API。
1. 安装
pip install flask-restful
2. 常用模块
Api, Resource, reqparse, abort
Flask-RESTful 提供了一个 Resource 基础类,它能够定义一个给定 URL 的一个或者多个 HTTP 方法。例如,定义一个可以使用 HTTP 的 GET, PUT 以及 DELETE 方法的 User 资源。
3. 实现举例
本例中我们将以对服务器数据库中的书目信息进行增删改查为例,实现API
规定 对象属性
ID:int
Name:str
Description:str
state:bool
|HTTP方法| --------------URL ------------------------------------------|-----------动作----------
|GET |http://[hostnamt]/restful_test/v2.0/tasks |检索任务列表
|GET |http://[hostnamt]/restful_test/v2.0/tasks/[task_id] |检索某个任务
|PUT |http://[hostnamt]/restful_test/v2.0/tasks/[task_id] |修改某个任务
|POST |http://[hostnamt]/restful_test/v2.0/tasks |创建新任务
|DELETE |http://[hostnamt]/restful_test/v2.0/tasks/[task_id]|删除某个任务
1)代码构架
根据我们的需求,设计整体代码构架如下
class TodoSimple1(Resource):
def get(self,task_id):
pass
def put(self,task_id):
pass
def delete(self,task_id):
pass
class TodoSimple2(Resource):
def get(self):
pass
def post(self):
pass
api.add_resource(TodoSimple1, '/restful_test/v2.0/tasks/<int task_id>', '/BookList')
api.add_resource(TodoSimple2, '/restful_test/v2.0/tasks', '/BookList')
由于我们定义的url分为两类:固定的,带有可变参数的。故定义了两个类TodoSimple1,TodoSimple2 。在第一个类里面实现get,put,delete方法,这些方法需要使用可变参数,在第二个类里面实现get,post方法,这些方法不需要使用可变参数。不同于直接使用flask里面使用装饰器来制定路由,使用api.add_resource()方法,为类指定路由,第一个参数为类名,第二个参数为制定的路由地址,第三个参数为指定的endpoint。
2)方法实现
构建一个全局的数据字典
BookList = {
'1': {
'id':1,
'name':"book1",
'description':"Math Book",
'state':True
},
'2': {
'id':2,
'name':"book2",
'description':"Chinese Book",
'state':True
}
}
字典中的数据使用key:value的形式
class TodoSimple2(Resource):
def get(self):
return BookList
def post(self):
task_id = int(max(BookList.keys())) + 1
task_id = '%i' % task_id
BookList[task_id] = {'name': request.form['name'],'id':request.form['id'],'description':request.form['description'],'state':request.form['state']}
return BookList
实现get方法,可以查看任务列表,使用post方法可以创建新的对象。使用request.from方法将from表单的数据加载到数据字典里面。
parse = reqparse.RequestParser()
parse.add_argument('name', type=str,location=['json'])
parse.add_argument('description', type=str,location=['json'])
parse.add_argument('state', type=str,location=['json'])
parse.add_argument('id', type=str,location=['json'])
class TodoSimple1(Resource):
def get(self,task_id):
return BookList[task_id]
def put(self,task_id):
args = parse.parse_args(strict=True)
BookList[task_id] = {'name': args['name'],'id':args['id'],'description':args['description'],'state':args['state']}
return BookList[task_id]
def delete(self,task_id):
del BookList[task_id]
return BookList
在这里着重说一下put方法。在put方法里面使用了restful里面的reqparse模块,来改变允许接收的数据类型。
parser.add_argument('app_id', type=zero_int, required=True, nullable=False, location=['json'])
parser.add_argument('user_num', type=empty_str, required=True, nullable=False, location=['json'])
type基本类型可以有:int , zero_int ,str,empty_str, location可以为:form , json等,详情可查看官方文档。这里要特别说一下如何获取前端的list参数,通过action和type结合使用设置
默认情况下,location为from形式,即接收from表单,当设置为json时就可以接收json包了。
4. 实现结果
学习积累
from表单和json的区别
application/json
随着json规范的越来越流行,并且浏览器支持程度原来越好,许多开发人员以application/json作为请求content-type,告诉服务器请求的主题内容是json格式的字符串,服务器端会对json字符串进行解析,这种方式的好处就是前端人员不需要关心数据结构的复杂度,只要是标准的json格式就能提交成功,application/json数据格式越来越得到开发人员的青睐。
application/x-www-form-urlencoded方式
是Jquery的Ajax请求默认方式,这种方式的好处就是浏览器都支持,在请求发送过程中会对数据进行序列化处理,以键值对形式?key1=value1&key2=value2的方式发送到服务器,如果用Jquery,它内部已经进行了处理,如果自己写原生的Ajax请求,就需要自己对数据进行序列化。