Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口
restful是一种api设计规范。
在restful架构中,主要使用post,delete,put和get四种http请求方式分别对指定的url资源进行增删改查操作。
restful之前的做法:
/users/query/1 get 根据用户id查询用户数据 /users/save post 新增用户 /users/update post 修改用户信息 /users/delete get/post 删除用户信息
restful做法:
/users/1 get 根据用户id查询用户数据 /users post 新增用户 /users put 修改用户信息 /users delete 删除用户信息
客户端的每一次请求,服务器都会给出回应,回应包括 http 状态码和数据两部分。
部分状态码:
get: 200 ok
post: 201 created
put: 200 ok
delete: 204 no content
使用flask实现一个restful api服务的例子
from flask import flask,jsonify,abort,make_response,request from flask_httpauth import httpbasicauth app = flask(__name__) auth = httpbasicauth() users = [ { 'id': 1, 'username': '小明', 'sex': 1 }, { 'id': 2, 'username': '小红', 'sex': 0 } ] #访问前需要提供用户名和密码 @auth.get_password def get_password(username): if username == 'admin': return '123456' return none #友好的错误提示:没有权限 @auth.error_handler def unauthorized(): return make_response(jsonify({'error': '未授权'}), 403) #友好的错误提示:找不到资源页面 @app.errorhandler(404) def not_found(error): return make_response(jsonify({'error': '找不到资源'}), 404) #返回所有用户的记录 @app.route('/api/v1.0/users', methods=['get']) @auth.login_required #需要认证 def get_users(): return jsonify({'users': users}) #返回一个用户的记录记录 @app.route('/api/v1.0/users/<int:user_id>', methods=['get']) @auth.login_required def get_user(user_id): user = list(u for u in users if u['id'] == user_id) if len(user) == 0: abort(404) return jsonify({'user': user[0]}) #插入一条用户记录 @app.route('/api/v1.0/users', methods=['post']) @auth.login_required def create_user(): if not request.json or not 'username' in request.json or not 'sex' in request.json: abort(400) user = { 'id': users[-1]['id'] + 1, 'username': request.json['username'], 'sex': request.json['sex'] } users.append(user) return jsonify({'user': user}), 201 #更新一个用户的记录 @app.route('/api/v1.0/users/<int:user_id>', methods=['put']) @auth.login_required def update_user(user_id): user = list(u for u in users if u['id'] == user_id) if len(user) == 0: abort(404) if not request.json: abort(400) user[0]['username'] = request.json.get('username', user[0]['username']) user[0]['sex'] = request.json.get('sex', user[0]['sex']) return jsonify({'user': user[0]}) #删除一个用户的记录 @app.route('/api/v1.0/users/<int:user_id>', methods=['delete']) @auth.login_required def delete_user(user_id): user = list(u for u in users if u['id'] == user_id) if len(user) == 0: abort(404) users.remove(user[0]) return jsonify({'result': true}),204 if __name__ == '__main__': app.run(debug=true)
使用postman测试接口
创建一个新的request,request name和create collection都随便输入如restfulapi,保存后,自动打开名称为restfulapi的标签页。
(1)测试/api/v1.0/users的get请求
restfulapi标签页默认选择 get,输入:localhost:5000/api/v1.0/users,这里直接点击send按钮,postman返回码:status:403 forbidden,返回内容
{ "error": "未授权" }
在authorization标签里面type选择basic auth,右边username和password分别输入admin和123456。
点击send按钮,postman返回码:status:201 created,返回内容:
{ "users": [ { "id": 1, "sex": 1, "username": "小明" }, { "id": 2, "sex": 0, "username": "小红" } ] }
(2)测试/api/v1.0/users/<int:user_id>的get请求
修改postman的请求方法和地址为:get localhost:5000/api/v1.0/users/2
(3)测试/api/v1.0/users的post请求
修改postman的请求方法和地址为:post localhost:5000/api/v1.0/users
在body标签里面选择raw、修改最后的默认text为json(application/json),下面输入框填写:
{ "id": 3, "sex": 1, "username": "小强" }
点击send按钮,postman返回码:status:201 created
把post方法直接改为get方法,可见返回3条记录。
(4)测试/api/v1.0/users/<int:user_id>的put请求
修改postman的请求方法和地址为:put localhost:5000/api/v1.0/users/3
在body标签里面选择raw、修改最后的默认text为json(application/json),下面输入框填写:
{ "id": 3, "sex": 1, "username": "小刚" }
点击send按钮,postman返回码:status:200 ok
(5)测试/api/v1.0/users/<int:user_id>的delete请求
修改postman的请求方法和地址为:delete localhost:5000/api/v1.0/users/3
点击send按钮,postman返回码:status:204 not content
使用python的第三方库requests测试接口
import requests,json url = 'http://localhost:5000/api/v1.0' auth = ('admin','123456') #查询 r=requests.get(url + '/users', auth=auth) print(r.status_code, r.text) #在控制台输出时中文会用unicode显示,可用下面方法显示中文 #print(json.dumps(json.loads(r.text),ensure_ascii=false)) r=requests.get(url + '/users/1', auth=auth) print(r.status_code, r.text) #更新 data = { "id": 3, "sex": 1, "username": "小强" } r=requests.post(url + '/users', auth=auth, json=data) print(r.status_code, r.text) #修改 data = { "id": 3, "sex": 1, "username": "小刚" } r=requests.put(url + '/users/3', auth=auth, json=data) print(r.status_code, r.text) #删除 r=requests.delete(url + '/users/3', auth=auth) print(r.status_code, r.text)