欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口

程序员文章站 2022-06-29 21:26:06
RESTful是一种API设计规范。 在RESTful架构中,主要使用POST,DELETE,PUT和GET四种HTTP请求方式分别对指定的URL资源进行增删改查操作。 使用Flask实现一个RESTful API服务的例子,用Postman测试接口,使用Python的第三方库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。

Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口

 

 点击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)