前言

很多想学习接口测试的同学,可能在最开始的时候,常常会因没有可以练习的项目而苦恼,毕竟网上可以练习的接口项目不多,有些可能太简单了,有些可能又太复杂了,或者是网上一些免费接口请求次数有限制,最终导致这些同学迟迟无法进行实践。

就拿我以前在练习JMeter时所用到的接口(相关链接:Jmeter接口测试实例-牛刀小试

),因为是网上别人开发的接口,有时候经常因各种原因导致无法正常使用,于是,我就想到为什么不可以自己开发一个简单的接口项目,来满足平常的练习呢?

因为目前使用Python比较广泛,考虑到Django比较笨重性,而我目前毕竟只是想开发一些简单接口,于是我选择了Flask。Flask是一个使用 Python 编写的轻量级 Web 应用框架,它非常容易上手,我们准备使用它来开发一个简单的接口项目。

安装Flask

在Python下,可以直接通过 pip 工具来进行安装,而在我环境下因为同时安装了python2和python3,所以用 pip3 来区分,安装命令:pip3 install Flask,如果想要查看当前Flask版本信息,可以使用命令:pip3 show flask,我目前使用的版本是 1.0.3

[root@wintest ~]# pip3 show flask
Name: Flask
Version: 1.0.3
Summary: A simple framework for building complex web applications.
Home-page: https://www.palletsprojects.com/p/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: /root/python36/lib/python3.6/site-packages
Requires: itsdangerous, Jinja2, click, Werkzeug
Required-by:
[root@wintest ~]#

为了更好的学习Flask,我们可以在网上找到Flask的官方文档和中文文档,以便进一步学习。

Flask官方文档(1.0.x版本):https://flask.palletsprojects.com/en/1.0.x/

Flask中文文档(最新版):https://dormousehole.readthedocs.io/en/latest/

最简单的应用

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello, World!'

上面是Flask官方提供的一个最简单的Flask应用,在PyCharm中,我们点击左上方的 file,选择 New Project,创建一个Flask项目。

在创建的项目中,会存在一个 app.py 文件,该文件里便包含了最简单的Flask应用代码。

我们执行代码启动Flask应用,可以看到如下信息:

可以发现,Flask应用的默认端口是 5000,我们打开本地浏览器,输入 http://127.0.0.1:5000/,便可以看到在界面上显示一行内容:Hello World!。

这是一个最简单的接口,用Flask实现只用了5行代码,可见Flask上手起来并不难。接下来,我们将会使用Flask来开发2个GET接口:获取所有用户信息接口和获取某个用户信息接口。

准备请求的用户数据

我们创建一个 Python包 ,包名设置为 api ,表示将用于存放后续编写的接口。在该包下新建一个 user.py 文件,这个文件用于编写用户相关的接口。

data = [
{"id": 1, "username": "小明", "password": "123456", "role": 0, "sex": 0, "telephone": "10086", "address": "北京市海淀区"},
{"id": 2, "username": "李华", "password": "abc", "role": 1, "sex": 0, "telephone": "10010", "address": "广州市天河区"},
{"id": 3, "username": "大白", "password": "666666", "role": 0, "sex": 1, "telephone": "10000", "address": "深圳市南山区"}
]

上面是我们准备的用户数据,因为我们暂没用到数据库,所以自己定义了一个列表,列表下存放多个用户信息,而每个用户信息,则通过字典来存储。每个字典均含有 id、username、password、telphone、address 等键名和键值。

通过jsonify返回JSON格式数据

我们在接口返回数据时,我们会定义一个字典,设置了接口返回码code、接口返回信息msg、返回数据实体data,用字典将这几个数据存储,并返回显示到页面上。

如果我们直接把这个定义的字典返回,在请求的时候就会出现报错:TypeError: 'dict' object is not callable,为解决这个问题,我们需要将这样的字典数据转换为JSON字符串,然后才能正常向页面返回。

一般情况,要返回JSON格式数据,我们可以直接使用 json 模块的 json.dumps() 方法,将字典转换为json字符串,然后返回 。

# 使用python的json模块
import json
json.dumps({"code":"0", "msg":"操作成功", "data":data})

但在Flask中,提供了jsonify方法供用户处理返回的序列化json数据,我们可以直接导入该方法并进行使用。

# 使用Flask的jsonify方式
from flask import Flask,jsonify
jsonify({"code":"0", "msg":"操作成功", "data":data})

在这里,我们将直接使用Flask的jsonify方式来处理返回的数据,需要注意的一点,使用该方法会把返回的 Content-Typetext/html 转换成带json特征的 application/json

获取所有用户信息接口

@app.route("/users", methods=["GET"])
def get_all_users():
"""获取所有用户信息"""
return jsonify({"code":"0", "data":data, "msg":"操作成功"})

这里的代码表示,当我们在请求路径为 /users ,且请求方法为GET方式时,才会执行 get_all_users 接口,最后才能返回JSON数据。

Flask的请求默认是GET请求,也就是说 @app.route() 中,我们可以不写 methods 参数,但这样只能通过GET方式来发出请求。如果需要支持其他的请求方式,那么这里的 methods 需要写成一个列表,当然也可以同时支持 GET、POST等请求方式,比如 methods=["GET", "POST"] 表示既支持GET方式也支持POST方式的请求。

获取某个用户信息接口

@app.route("/users/<int:user_id>", methods=["GET"])
def get_user(user_id):
"""获取某个用户信息"""
if user_id > 0 and user_id <= len(data):
return jsonify({"code": "0", "data": data[user_id - 1], "msg": "操作成功"})
return jsonify({"code": "1", "msg": "用户不存在"})

在这里,我们的请求URL中有变量(因为需要获取指定的用户信息),对于变量,我们需要使用 <> ,如 <user_id>,这样就可以将这些特殊部分标记为变量名。

在上面代码中,我们使用的是 <int:user_id>,这里用到了Flask自带的路由转换器 int,表示接收到的 user_id 是整数类型,如果不加的话,那么就默认是 string 转换器。

而我们获取到指定的用户信息,则是用 data[user_id - 1] 来实现,比如要获取到data中第2条用户信息,那么用data[1]就可以得到,另外,如果请求的 user_id 不在当前范围的,则是直接返回用户不存在的JSON数据。。

设置返回中文数据正常显示

完成以上内容后,我们运行代码,然后到Chrome浏览器上进行请求。

这里在Chrome浏览器中文显示为了Unicode字符编码,虽然不影响接口的读取,但是可读性不好啊,于是需要在代码中做简单处理,直接加一行代码即可:

app.config["JSON_AS_ASCII"] = False # jsonify返回的中文正常显示

最后,再次进行请求,就可以得到想要的数据了。

源码附上:

from flask import Flask, jsonify

app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False # jsonify返回的中文正常显示 data = [
{"id": 1, "username": "小明", "password": "123456", "role": 0, "sex": 0, "telephone": "10086", "address": "北京市海淀区"},
{"id": 2, "username": "李华", "password": "abc", "role": 1, "sex": 0, "telephone": "10010", "address": "广州市天河区"},
{"id": 3, "username": "大白", "password": "666666", "role": 0, "sex": 1, "telephone": "10000", "address": "深圳市南山区"}
] @app.route('/')
def hello_world():
return 'Hello World!' @app.route("/users", methods=["GET"])
def get_all_users():
"""获取所有用户信息"""
return jsonify({"code": "0", "data": data, "msg": "操作成功"}) @app.route("/users/<int:user_id>", methods=["GET"])
def get_user(user_id):
"""获取某个用户信息"""
if user_id > 0 and user_id <= len(data):
return jsonify({"code": "0", "data": data[user_id - 1], "msg": "操作成功"})
return jsonify({"code": "1", "msg": "用户不存在"}) if __name__ == '__main__':
app.run()

使用Flask开发简单接口(1)--GET请求接口的更多相关文章

  1. 使用Flask开发简单接口(5)--数据加密处理

    前言 在之前开发的接口中,我们设计把用户信息存储到数据库时,没有对数据进行加密处理,为了提高下安全性,我们今天就学习下,如何对用户数据进行加密加盐处理. MD5加密加盐 MD5加密 MD5是常用的一种 ...

  2. 使用Flask开发简单接口(2)--POST请求接口

    今天我们继续学习如何使用Flask开发POST接口:用户注册接口和用户登录接口. request接收参数 当我们在页面发出一个POST请求,请求传到服务器时,需要如何拿到当前请求的数据呢?在Flask ...

  3. 使用Flask开发简单接口(3)--引入MySQL

    前言 前面的两篇文章中,我们已经学习了通过Flask开发GET和POST请求接口,但一直没有实现操作数据库,那么我们今天的目的,就是学习如何将MySQL数据库运用到当前的接口项目中. 本人环境:Pyt ...

  4. 使用Flask开发简单接口(4)--借助Redis实现token验证

    前言 在之前我们已开发了几个接口,并且可以正常使用,那么今天我们将继续完善一下.我们注意到之前的接口,都是不需要进行任何验证就可以使用的,其实我们可以使用 token ,比如设置在修改或删除用户信息的 ...

  5. 使用Flask开发简单接口

    作为测试人员,在工作或者学习的过程中,有时会没有可以调用的现成的接口,导致我们的代码没法调试跑通的情况. 这时,我们使用python中的web框架Flask就可以很方便的编写简单的接口,用于调用或调试 ...

  6. andriod开发,简单的封装网络请求并监听返回.

    一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...

  7. python接口自动化根据请求接口类型进行封装

    根据不同的请求类型(GET/POST)进行接口请求封装 import requests import json class RunMain: def __init__(self, url, metho ...

  8. 动态生成简约MVC请求接口|抛弃一切注解减少重复劳动吧

    背景 目前创建一个后端请求接口给别人提供服务,无论是使用SpringMVC方式注解,还是使用SpringCloud的Feign注解,都是需要填写好@RequestMap.@Controller.@Pa ...

  9. iOS开发-网络-合理封装请求接口

    概述 如今大多App都会与网络打交道,作为开发者,合理的对网络后台请求接口进行封装十分重要.本文要介绍的就是一种常见的采用回调函数(方法)的网络接口封装,也算的是一种构架吧. 这个构架主要的idea是 ...

随机推荐

  1. MySQL和PHP中以整型存储IP地址

    正文:将IP地址以整型存储 一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般是用varchar或char类型存储.但是其实有更好的存储方法就是以整型存储IP地址. 因为c ...

  2. JVM 专题十四:本地方法接口

    1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个java方法:该方法的实现由非Ja ...

  3. typeError:The value of a feed cannot be a tf.Tensor object.Acceptable feed values include Python scalars,strings,lists.numpy ndarrays,or TensorHandles.For reference.the tensor object was Tensor...

    如上贴出了:错误信息和错误代码. 这个问题困扰了自己两天,报错大概是说输入的数据和接受的格式不一样,不能作为tensor. 后来问了大神,原因出在tf.reshape(),因为网络训练时用placeh ...

  4. 双网卡bonding

    网卡:计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡).网络接口板又称为通信适配器或网络适配器(adapter)或网络接口卡NIC(Network ...

  5. 据说比Spring快44倍的web开发框架,不妨试试

    该框架称为:**light-4j **.官方网站简介:A fast, lightweight and more productive microservices framework.很简单,翻译过来就 ...

  6. QQ音乐Android客户端Web页面通用性能优化实践

    QQ音乐 Android 客户端的 Web 页面日均 PV 达到千万量级,然而页面的打开耗时与 Native 页面相距甚远,需要系统性优化.本文将介绍 QQ 音乐 Android 客户端在进行 Web ...

  7. python pytest接口自动化框架搭建(一)

    1.首先安装pytest pip install pytest 2.编写单测用例 在pytest框架中,有如下约束: 所有的单测文件名都需要满足test_*.py格式或*_test.py格式. 在单测 ...

  8. UVA 10653.Prince and Princess

    题目 In an n * n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbe ...

  9. iview实战 : 全屏去头去尾的弹窗

    <template> <Button @click="modal3 = true" >No title bar</Button> <Mod ...

  10. 一个深拷贝方法的漏洞与一个javascript经典bug

    今天做某个项目,需要函数深拷贝. 在网上随便找了个代码粘上去,结果报错了. /** * * @desc 递归法 对象深拷贝 * @param {Object} * @return {new Objec ...