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 ''
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)

上面例子,也可以使用Flask-RESTful实现

from flask import Flask,jsonify,abort,make_response,request
from flask_httpauth import HTTPBasicAuth
from flask_restful import Api,Resource,reqparse app = Flask(__name__)
api = Api(app)
auth = HTTPBasicAuth() users = [
{
'id': 1,
'username': '小明',
'sex': 1
},
{
'id': 2,
'username': '小红',
'sex': 0
}
] #验证字段的合法性
parser = reqparse.RequestParser()
parser.add_argument('username', type = str, required = True, help = '此字段格式有问题', location = 'json')
parser.add_argument('sex', type = int, default = "", location = 'json') #访问前需要提供用户名和密码
@auth.get_password
def get_password(username):
if username == 'admin':
return ''
return None class UserListAPI(Resource):
decorators = [auth.login_required] def get(self):
return {'users': users} def post(self):
args = parser.parse_args()
user = {
'id': users[-1]['id'] + 1,
'username': args['username'],
'sex': args['sex']
}
users.append(user)
return {'user': user}, 201 class UserAPI(Resource):
decorators = [auth.login_required] def get(self, id):
user = list(u for u in users if u['id'] == id)
if len(user) == 0:
abort(404)
return {'user': user[0]} def put(self, id):
user = list(u for u in users if u['id'] == id)
if len(user) == 0:
abort(404)
user = user[0]
args = parser.parse_args()
for k, v in args.items():
if v != None:
user[k] = v
return { 'user': user } def delete(self, id):
user = list(u for u in users if u['id'] == id)
if len(user) == 0:
abort(404)
users.remove(user[0])
return {'result': True} api.add_resource(UserListAPI, '/api/v1.0/users', endpoint = 'users')
api.add_resource(UserAPI, '/api/v1.0/users/<int:id>', endpoint = 'user') 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','') #查询
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)

Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口的更多相关文章

  1. 使用 Python 和 Flask 设计 RESTful API

    近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配. 在本文中我将向你展示如何简单地使用 Pyt ...

  2. Python 和 Flask 设计 RESTful API

    #!flask/bin/python from flask import Flask, jsonify from flask import make_response app = Flask(__na ...

  3. flask开发restful api系列(8)-再谈项目结构

    上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...

  4. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  5. Flask之RESTFul API前后端分离

    Flask之RESTFul API前后端分离 一:虚拟环境搭建的两种方式 1 pipenv的使用 pip install --user pipenv安装pipenv在用户目录下 py -m site ...

  6. 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)

    一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...

  7. 使用 Flask 实现 RESTful API

    原文出处: Luis Rei   译文出处:nummy 简介 首先,安装Flask     1 pip install flask 假设那你已经了解RESTful API的相关概念,如果不清楚,可以阅 ...

  8. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

  9. flask开发restful api系列(6)-配置文件

    任何一个好的程序,配置文件必不可少,而且非常重要.配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失.要有灵活性,用户可以自己配置:生产环境和开发环境要分开,最好能简单的修改一个东西, ...

随机推荐

  1. Dynamics 365 Portal 多语言

    Dynamics 365 Portal 的多语言分两种情况: 1.通过定义两套记录来实现,如Web Link Set.Snippet Content,都是定义两套记录,分别关联不同的语言来实现 Web ...

  2. Cesium专栏-雷达遮罩动态扫描(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  3. Windows系统下解决PhPStudy MySQL启动失败

    报错 Apache\Nginx服务正常启动了,但是MySQL却一直启动失败. 解决流程 查看端口是否被占用 打开系统自带的资源管理器,查看监听端口3306是不是被占用,下图中3306端口被mysqld ...

  4. JavaScript图形实例:布纹图案

    1.椭圆型布纹图案 先在HTML页面中设置一个画布. <canvas id="myCanvas" width="300" height="300 ...

  5. 一目了然卷积神经网络 - An Intuitive Explanation of Convolutional Neural Networks

    An Intuitive Explanation of Convolutional Neural Networks 原文地址:https://ujjwalkarn.me/2016/08/11/intu ...

  6. How to: Change the Format Used for the FullAddress and FullName Properties 如何:更改用于FullAddress和FullName属性的格式

    There are FullAddress and FullName properties in the Address and Person business classes that are su ...

  7. MyBatis框架之第一篇

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...

  8. 【Cocos谁学谁会】定制属于自己的脚本模板

    版权申明: 本文原创首发于以下网站,您可以自由转载,但必须加入完整的版权声明 博客园:https://www.cnblogs.com/MogooStudio/ csdn博客:https://blog. ...

  9. svn忽略文件不提交至服务器的方法

    在提交界面,右键加入忽略提交列表.可以实现忽略本地文件不提交,且不删除服务器上的文件.

  10. 分享一个酷炫动态登录页面html

    话不多说,如下图: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <H ...