工作原理:
客户端发送request,服务端response一个json对象。
restful是一种设计模式,它的基础是资源,只要在资源上定义方法就能够访问http方法(get,put,post,delete。。)
Restful Url的要求:
在restful架构中,每个网址代表一种资源,所以网址中不能有动词,只能有名词。
举个例子:比如有一个数据资源:
datas = [{'name': 'javascript', 'useto': 'web development'},
{'name': 'python', 'useto': 'do anything'},
{'name': 'php', 'useto': 'web development'},
{'name': 'c++', 'useto': 'web server'}]
当我们要获取数据集合的时候就可以这么请求:
http://xxx.com/api/languages
当我们要获取一条数据的详细信息的时候,可以这么请求:
http://xxx.com/api/languages/python
RestFul对于资源的具体操作类型,由HTTP动词表示(相同的url,执行不同的动作,得到的结果是不同的)
GET:从服务器取出资源。
POST:在服务器新建一个资源。
PUT:在服务器更新资源。
PATCH:在服务器更新资源(部分)。
DELETE:从服务器删除资源 。
使用:
1. Flask 的视图函数来定义所有的路由
#这是数据源
datas = [{'name': 'javascript', 'useto': 'web development'},
{'name': 'python', 'useto': 'do anything'},
{'name': 'php', 'useto': 'web development'},
{'name': 'c++', 'useto': 'web server'}]
#获取所有的资源
@app.route('/languages',methods=['GET'])
def getAll():
return fullResponse(R200_OK, datas)
#根据name获取资源中的某一个
@app.route('/languages/',methods=['GET'])
def getOne(name):
result = [data for data in datas if data['name'] == name]
if len(result) == 0:
return statusResponse(R404_NOTFOUND)
return fullResponse(R200_OK, result[0])
#POST,添加
@app.route('/languages', methods=['POST'])
def addOne():
request_data = request.get_json()
if not 'name' in request_data or not 'useto' in request_data:
return statusResponse(R400_BADREQUEST)
name = request_data['name']
useto = request_data['useto'] datas.append({'name': name, 'useto': useto})
return statusResponse(R201_CREATED)
#PUT,PATCH 更新资源
@app.route('/languages/', methods=['PUT', 'PATCH'])
def editOne(name):
result = [data for data in datas if data['name'] == name]
if len(result) == 0:
return statusResponse(R404_NOTFOUND)
request_data = request.get_json()
if 'name' in request_data:
result[0]['name'] = request_data['name']
if 'useto' in request_data:
result[0]['useto'] = request_data['useto']
return statusResponse(R201_CREATED)
#DELETE
@app.route('/languages/', methods=['DELETE'])
def delOne(name):
result = [data for data in datas if data['name'] == name]
if len(result) == 0:
return statusResponse(R404_NOTFOUND)
datas.remove(result[0])
return statusResponse(R204_NOCONTENT)
2.利用 Resource 基础类,定义一个给定 URL 的一个或者多个 HTTP 方法
TODOS={ 'todo1': {'task':'build an API'},
'todo2': {'task':'?????'},
'todo3': {'task':'profit!'}
}
#判断资源是否存在
def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
abort(404,message="Todo{}doesn't exist".format(todo_id))
#验证请求数据
parser = reqparse.RequestParser()
parser.add_argument( 'task' ,type=str)
# 定义单个资源get,delete,put方法
classTodo(Resource):
def get(self,todo_id):
abort_if_todo_doesnt_exist(todo_id)
returnTODOS[todo_id]
def delete(self,todo_id):
abort_if_todo_doesnt_exist(todo_id)
del TODOS[todo_id]
return ' ', 204
def put(self,todo_id):
args = parser.parse_args()
task = { 'task' : args['task'] }
TODOS[todo_id] = task
return task, 201
#获取所有资源 ,添加一个资源
classTodoList(Resource):
def get(self):
return TODOS
def post(self):
args = parser.parse_args()
todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
todo_id = 'todo%i' % todo_id
TODOS[todo_id ] = { 'task' : args['task'] }
return TODOS[todo_id], 201
api.add_resource(TodoList,'/todos')
api.add_resource(Todo,'/todos/<todo_id>')
3.验证,可以用curl命令行模拟http的请求
1.获取列表
curl http://localhost:5000/todos
2.获取一个单独的任务
curl http://localhost:5000/todos/todo3
3.删除一个任务
curl http://localhost:5000/todos/todo2 -X DELETE -v
4.增加一个新的任务
curl http://localhost:5000/todos -d "task=something new" -X POST -v
5.更新一个任务
curl http://localhost:5000/todos/todo3 -d "task=something different" -X PUT -v