侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用python实现接口的方法

Python  /  管理员 发布于 7年前   159

接口基础知识:

简单说下接口测试,现在常用的2种接口就是http api和rpc协议的接口,今天主要说:http api接口是走http协议通过路径来区分调用的方法,请求报文格式都是key-value形式,返回报文一般是json串;

接口协议:http、webservice、rpc等。

请求方式:get、post方式

请求参数格式:

  a. get请求都是通过url?param=xxx¶m1=xxx

  b. post请求的请求参数常用类型有:application/json、application/x-www-form-urlencoded、multipart/form-data、text/html等。

还需要知道接口的url、参数类型、返回结果的数据格式、了解接口是否有header、cookie等信息。 

接口的实现:请求方式-get,接口的写法:

 import flask from flask import request from flask import jsonify import tools import OP_db import settings ''' flask: web框架,可以通过flask提供的装饰器@server.route()将普通函数转换为服务 登录接口,需要传url、username、passwd ''' #创建一个服务,把当前这个python文件当做一个服务 server = flask.Flask(__name__) #server.config['JSON_AS_ASCII'] = False  # @server.route()可以将普通函数转变为服务 登录接口的路径、请求方式 @server.route('/login', methods=['get']) def login():  # 获取通过url请求传参的数据  username = request.values.get('name')  # 获取url请求传的密码,明文  pwd = request.values.get('pwd')  # 判断用户名、密码都不为空,如果不传用户名、密码则username和pwd为None  if username and pwd:   # 获取加密后的密码   password = tools.md5_pwd(pwd)   #执行sql,如果查询的username和password不为空,说明数据库存在admin的账号   sql = 'select name,password from test where name= "%s" and password= "%s";' %(username, password)   # 从数据查询结果后,res返回是元组   res = OP_db.getconn(    host=settings.mysql_info['host'],    user=settings.mysql_info['user'],    passwd=settings.mysql_info['pwd'],    db=settings.mysql_info['db'],    port=settings.mysql_info['port'],    sql=sql   )   if res:  #res的结果不为空,说明找到了username=admin的用户,且password为加密前的123456    resu = {'code': 200, 'message': '登录成功'}    return jsonify(resu) #将字典转换为json串, json是字符串   else:    resu = {'code': -1, 'message': '账号/密码错误'}    return jsonify(resu)  else:   res = {'code': 999, 'message': '必填参数未填写'}   return jsonify(res)  if __name__ == '__main__':  server.run(debug=True, port=8888, host=0.0.0.0) #指定端口、host,0.0.0.0代表不管几个网卡,任何ip都可以访问
md5加密、数据库mysql的操作详见我的其他博客~~~~~

get访问接口:

项目启动后,接口的地址是:http://127.0.0.1:5000/,默认端口是5000。

打开浏览器,输入urlhttp://127.0.0.1:5000/xxx?name=xxx&pwd=123456,后面跟上接口的地址login,参数跟url直接使用?相连,每个请求参数直接使用&相连。请求成功,则返回{'code': 200, 'message': '登录成功'}。

 请求方式-post,接口的写法:

 import flask from flask import jsonify from flask import request from conf import opMysql from conf import md5_create ''' 注册接口: post请求,请求参数入参类型json {  "username":"aaa",  "pwd":"123456",  "c_pwd":"123456" } ''' server = flask.Flask(__name__) @server.route('/register', methods=['get', 'post']) def registerPost():  #判断接口的请求方式是GET还是POST  if request.method == 'POST':   # 获取请求参数是json格式,返回结果是字典   params = request.json   username = params.get('username')   pwd = params.get('pwd')   confirmpwd = params.get('confirmpwd')   if username and pwd and confirmpwd: # 判断输入的用户名、密码、确认密码都不为空    select_sql = 'select username from lhldemo where username = "%s" ;'%username    # 查询注册的用户是否存在数据库,如果存在,则username不为空,否则username为空    res_mysql = opMysql.op_select(select_sql)    if res_mysql:     return jsonify({"code": 999, "mesg": "用户已注册"})    else:     if pwd == confirmpwd: # 判断pwd和confirmpwd一致      new_pwd = md5_create.md5_test(pwd) # 加密后的密码      insert_sql = 'insert into lhldemo(username,password) values("%s", "%s") ;' % (username, new_pwd)      opMysql.op_insert(insert_sql)      return jsonify({"code": 200, "msg": "注册成功"})     else:      return jsonify({"code":998, "msg":"密码不一样"})   else:    return jsonify({"code": 504, "msg": "必填项不能为空"})  else:   return jsonify({"code": 201, "msg": "请求方式不正确"})  if __name__ == '__main__':  #port可以指定端口,默认端口是5000  #host写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,默认是127.0.0.1  server.run(debug=True, port=8899, host='0.0.0.0')
post访问接口:

项目启动后,接口的地址是:http://127.0.0.1:5000/,默认端口是5000。

打开浏览器,输入urlhttp://127.0.0.1:5000/xxx,后面跟上接口的地址register,参数使用postman或jmeter进行请求,参数类型是json。请求成功,则返回{'code': 200, 'message': '登录成功'}。

请求方式-get、post都可以访问,写法如下:

 import flask from flask import jsonify from flask import request from conf import opMysql from conf import md5_create ''' 注册接口: post请求,请求参数入参类型json {  "username":"aaa",  "pwd":"123456",  "c_pwd":"123456" } ''' server = flask.Flask(__name__) @server.route('/register', methods=['get', 'post']) def registerPost():  #post请求获取请求的参数,返回结果类型是str  username = request.values.get('username')  pwd = request.values.get('pwd')  confirmpwd = request.values.get('confirmpwd')  if username and pwd and confirmpwd: # 判断输入的用户名、密码、确认密码都不为空   select_sql = 'select username from lhldemo where username = "%s" ;'%username   # 查询注册的用户是否存在数据库,如果存在,则username不为空,否则username为空   res_mysql = opMysql.op_select(select_sql)   if res_mysql:    return jsonify({"code": 999, "mesg": "用户已注册"})   else:    if pwd == confirmpwd: # 判断pwd和confirmpwd一致     new_pwd = md5_create.md5_test(pwd) # 加密后的密码     insert_sql = 'insert into lhldemo(username,password) values("%s", "%s") ;' % (username, new_pwd)     opMysql.op_insert(insert_sql)     return jsonify({"code": 200, "msg": "注册成功"})    else:     return jsonify({"code": 998, "msg": "密码不一样"})  else:   return jsonify({"code": 504, "msg": "必填项不能为空"})   if __name__ == '__main__':  #port可以指定端口,默认端口是5000  #host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,  server.run(debug=True, port=8899, host='0.0.0.0')
可以通过以下2种方式进行post请求,一种如下:

通过url拼接参数:

第二种访问方式:通过key-value方式进行访问:

 redis相关操作,添加hash类型的值到redis内,接口实现如下:

 import flask from flask import jsonify from conf import opRedis from flask import request ''' redis添加数据,存入数据的类型是hash类型,格式如下: post请求,请求参数入参类型json {name:{"key":"value"}} {"username":"url"} ''' server = flask.Flask(__name__) @server.route('/set_sties', methods =['post']) def set_sties():  # 获取url请求参数,返回结果是字典{"username":"byz","url":"http://www.baidu.com"}  res_dic = request.json  if res_dic.get('username') and res_dic.get('url'):   username = res_dic.get('username')   url = res_dic.get('url')   #调用redis的hset方法,将username、url存入redis   opRedis.get_hashall('sites', username, url)   return jsonify({"code":20})  else:   return jsonify({"code": 204, "msg": "必填项不能为空"})  if __name__ == '__main__':  #port可以指定端口,默认端口是5000  #host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,  server.run(debug=True, port=8899, host='0.0.0.0')
hash类型结构如下:

{name:{key,value}},接口访问成功后,redis内数据存储结构如下:

redis添加完数据后,读取redis内的数据,接口实现如下:

 import flask from flask import jsonify from conf import opRedis from flask import request ''' 读取redis内的数据,redis数据存储类型是hash类型,格式如下 {name:{"key":"value"}} 思路: 1.通过redis的hgetall(name)方法读取redis所有数据,返回结果类型是字典  2. 循环字典内容,将元素类型转换为str,并将结果存放到字典内 ''' server = flask.Flask(__name__) @server.route('/get_sties', methods =['get', 'post']) def get_sties():  #获取redis内所有的数据信息,返回结果类型是字典,里面元素是bytes类型,name=sites  dic = opRedis.get_hashall('sites')  redisList = []  for key, value in dic.items():   redis_dic = {}   #将字典内元素的类型由bytes转换为str   k = key.decode()   v = value.decode()   #字典redis_dic内结构{"username:k, "url":v}   redis_dic['username'] = k   redis_dic['url'] = v   redisList.append(redis_dic)  return jsonify({"code": 200, "msg": redisList})  if __name__ == '__main__':  #port可以指定端口,默认端口是5000  #host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,  server.run(debug=True, port=8899, host='0.0.0.0')
通过postman方法接口,返回数据如下:

 查询用户,需要传token值,实现方法如下:

登录接口:

 import flask from flask import jsonify from conf import opRedis from conf import opMysql from conf import md5_create from flask import request import time ''' 登录接口,需要传用户名、密码,通过查询数据库判断用户是否登录成功,若登录成功则将用户名和token存入redis内 ''' server = flask.Flask(__name__) @server.route('/login', methods=['get','post']) def set_cookies():  name = request.values.get('username')  pwd = request.values.get('pwd')  if name and pwd:   #加密后的密码   new_pwd = md5_create.md5_test(pwd)   sql = 'select username,password from lhldemo where username="%s" and password="%s" ; ' % (name, new_pwd)   res_sql = opMysql.op_select(sql)   if res_sql:    token = name + time.strftime('%Y%m%d%H%M%S')    new_token = md5_create.md5_test(token)    #用户登录成功后,将name和token存入redis,存入数据类型是hash类型    opRedis.get_hashall('user', name, new_token)    return jsonify({"code": 200})   else:    return jsonify({"code": 204})  else:   return jsonify({"code": 304})

 查询用户,需要传用户名和token值,实现方法如下:

 import flask from flask import jsonify from conf import opRedis from conf import opMysql from conf import md5_create from flask import request import time ''' 登录接口,需要传用户名、密码,通过查询数据库判断用户是否登录成功,若登录成功则将用户名和token存入redis内 ''' server = flask.Flask(__name__) @server.route('/search_user', methods=['get','post']) def set_cookies():  name = request.values.get('username')  token = request.values.get('token')  print('token',token)  if name and token:   #查看数据库,看查询的用户是否存在,若存在则返回用户id   sql = 'select id from lhldemo where username="%s" ; ' % (name)   res_sql = opMysql.op_select(sql)   if res_sql:    #从redis中获取user下的用户名对应的token值    res_token = opRedis.getRedis('user:'+name)26    if res_token == token:     return jsonify({"msg": "用户id", "id": res_sql})    else:     return jsonify({"msg": "token错误"})   else:    return jsonify({"code": "用户不存在"})  else:   return jsonify({"code": "必填项不能为空"})  if __name__ == '__main__':  #port可以指定端口,默认端口是5000  #host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,  server.run(debug=True, port=8899, host='0.0.0.0')
 以上就是工作中常用的一些接口场景,测试支付相关接口、或者第三方接口时,可以自己mock接口返回假数据操作~~~~

 


  • 上一条:
    Python中字典和集合学习小结
    下一条:
    python函数中return后的语句一定不会执行吗?
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客