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. iOS核心动画高级技巧-4

    8. 显式动画 显式动画 如果想让事情变得顺利,只有靠自己 -- 夏尔·纪尧姆 上一章介绍了隐式动画的概念.隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并 ...

  2. 在mpvue引入flyio

    先来说微信小程序原生的请求接口方式吧,如官网文档,在页面中请求直接调用 在这里感谢接的是提供的免费接口https://blog.csdn.net/c__chao/article/details/785 ...

  3. spark-3.0 application 调度算法解析

    spark 各个版本的application 调度算法还是有这明显的不同之处的.从spark1.3.0 到 spark 1.6.1.spark2.0 到 现在最新的spark 3.0 ,调度算法有了一 ...

  4. docker学习笔记---基本命令

    [root@docker ~]# docker Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Opt ...

  5. 面试连环炮系列(六):Dubbo应用为什么要部署Zookeeper

    Dubbo应用为什么要部署Zookeeper? Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口.由于Z ...

  6. SpringSession 独立使用

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  7. python3内置函数回忆

    1.数学运算类 # 1.数学运算类 # abs:计算绝对值 print(abs(-23)) # divmod,返回一个tuple,第一个值为商,第二个值为余数 print(divmod(10,4)) ...

  8. C# Task 多任务 限制Task并发数量

    LimitedTaskScheduler: using System; using System.Collections.Concurrent; using System.Collections.Ge ...

  9. IDEA去除掉虚线,波浪线,和下划线实线的方法

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小 ...

  10. Docker 私服Registry简介与使用Docker-Compose安装Registry

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...