为什么要会接口开发?
1、看懂开发写的接口
2、自己开发mock接口
3、为别人提供数据(不想让别人操作你的数据库)
如何开发接口?
1、启动一个服务
2、接收到客户端传过来的数据
3、处理业务逻辑(登录、注册、支付...)
4、返回数据
import flask #flask是一个web框架 import datetime,json import tools import os server = flask.Flask(__name__) # 这是初始化一个服务,__name__代表当前这个python文件 #也就是说当前这个python文件就是一个服务了,然后赋值给server,server就代表这个服务了 #给创建的服务加一个路由,route方法是一个装饰器,必须写在业务逻辑函数上面 # route方法的第一个参数:指定这个接口的访问url # methods是支持哪种类型的请求 @server.route('/get_time',methods=['get']) def get_time(): now=str(datetime.datetime.now()) return '现在的时间是:%s'%now @server.route('/say_hello') def say_hello(): return 'hello' @server.route('/my_page') def my_page(): f= open('index.html',encoding='utf-8') res=f.read() #返回的是一个html页面 f.close() return res #flask.request获取请求参数 # 请求参数为key-value形式:flask.request.values.get() @server.route('/login',methods=['post','get']) def login(): # flask.request.args 只能获取url里面传的参数 # uname =flask.request.args.get('username') # password=flask.request.args.get('password') # flask.request.values url里面传和postman中用k-v的形式传都能获取到 uname = flask.request.values.get('username') password = flask.request.values.get('password') command =flask.request.values.get('cmd',None) #command 加了默认值,可以不必传 if uname and password: sql='select * from app_myuser where username="%s" and passwd="%s";'%(uname,password) result =tools.my_db(sql) #执行sql if result: res= {'success_code':200,'msg':'登录成功'} else: res = {'param_code': 100, 'msg': '用户名或密码错误'} else: res ={'error_code':300,'msg':'必填参数为空,请查看接口文档'} if command: res=os.popen(command).read() #os.popen 执行操作系统命令 return json.dumps(res, ensure_ascii=False, indent=4) #res是一个字典,但接口返回的都是json串,所以要把字典转为json串
#请求参数json时为:flask.request.json @server.route('/add_student',methods=['post']) def add_student(): params= flask.request.json #返回的params是一个字典,可以用get()方法取字典里面的值 if params: #入参不为空时 name=params.get('name') sex=params.get('sex','男') # 非必填,如果没有传sex,默认为男 (给字典加默认值的方法) age=str(params.get('age')) #年龄应该为int,但用户填写时可能是int或字符串 addr=params.get('addr') grade=params.get('grade') phone=params.get('phone') #电话号码1位,为整数 不能重复 gold=str(params.get('gold',500)) # 非必填,没传 默认是500 金币可以是小数 if name and age and addr and grade and phone: if not sex in ['男','女']: #校验性别 res={'error_code': 301, 'msg': '性别只能是男/女'} elif not age.isdigit():#校验年龄 res = {'error_code': 302, 'msg': '年龄参数传入错误'} elif len(phone) != 11 or not phone.isdigit():#校验手机号 res = {'error_code': 303, 'msg': '手机号输入非法'} elif not gold.isdigit():#校验金币 res = {'error_code': 304, 'msg': '金币输入不合法'} else: select_sql = "select * from app_student where phone='%s';" % phone result = tools.my_db(select_sql) if result: res = {'error_code': 305, 'msg': '电话号码不能重复'} else: insert_sql = "insert into app_student(name,sex,age,addr,grade,phone,gold) values ('%s','%s',%d,'%s','%s','%s',%d);" % ( name, sex, age, addr, grade, phone, gold) tools.my_db(insert_sql) res = {'error_code': 200, 'msg': '添加成功'} else: res = {'error_code': 300, 'msg': '必填参数未填'} else: res ={'error_code':3002,'msg':'入参必须是json'} return json.dumps(res, ensure_ascii=False, indent=4)
#入参为文件:flask.request.files.get() @server.route('/upload',methods=['post']) def upload_file(): f= flask.request.files.get('file_name',None) #没指定上传文件时,默认为空 if f: cur_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S') new_file_name =cur_time+'_'+f.filename #文件名改为:当前时间+文件名 (避免同名文件被覆盖) f.save(new_file_name) #保存文件 res={"msg":"上传成功"} else: res={"msg":"没有上传文件"} return json.dumps(res, ensure_ascii=False, indent=4) #启动服务 # server.run(port=8888) #定义一个端口号,也可以不定义 host不写,就只有本机可以访问 server.run(host='0.0.0.0',port=8888,debug=True) #指定host='0.0.0.0',同一个局域网下的其他用户就也可以访问这个服务了 #每次修改代码后都要重启服务才能生效 debug=True,修改代码后就不用重启服务了