使用python实现接口的方法

接口基础知识:

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

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

请求方式:get、post方式

请求参数格式:

  a. get请求都是通过url?param=xxx&param1=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接口返回假数据操作~~~~

(0)

相关推荐

  • linux系统使用python监测网络接口获取网络的输入输出

    net.py 获取网络接口的输入和输出 复制代码 代码如下: #!/usr/bin/env Pythonimport timeimport sys if len(sys.argv) > 1: INTERFACE = sys.argv[1]else: INTERFACE = 'eth0'STATS = []print 'Interface:',INTERFACE def rx(): ifstat = open('/proc/net/dev').readlines() for interface i

  • 使用Python的Bottle框架写一个简单的服务接口的示例

    是不是有这么一个场景,对外提供一堆数据或者是要返回给用户一个结果.但是不想把内部的一些数据和逻辑暴露给对方...简单点来说,就是想以服务的方式对外提供一个接口.对于这种有很多处理方式,RPC,搭建一个web服务啥的....但是这些毕竟都太重量级了,操作起来很麻烦.我这里给出的一种非常easy的方式来处理.使用bottle解决问题. 需求: 检查一个zookeeper服务中的某些节点是否存在,如果存在返回OK,不存在则给出不存的节点信息.要求返回的信息是和pyunit的结果信息一致. 实现环境:

  • 在Python的框架中为MySQL实现restful接口的教程

    最近在做游戏服务分层的时候,一直想把mysql的访问独立成一个单独的服务DBGate,原因如下: 请求收拢到DBGate,可以使DBGate变为无状态的,方便横向扩展 当请求量或者存储量变大时,mysql需要做分库分表,DBGate可以内部直接处理,外界无感知 通过restful限制对数据请求的形式,仅支持简单的get/post/patch/put 进行增删改查,并不支持复杂查询.这个也是和游戏业务的特性有关,如果网站等需要复杂查询的业务,对此并不适合 DBGate使用多进程模式,方便控制与my

  • Python+微信接口实现运维报警

    说到运维报警,我觉得都可以写个长篇历史来详细解释了报警的前世来生,比如最早报警都是用邮件,但邮件实时性不高,比如下班回家总不能人一直盯着邮箱吧,所以邮件这种报警方式不适合用来报紧急的故障,日常磁盘利用率监控什么的可以用它来报没问题,网站宕机不能访问这种故障,用它就明显不合适了,那对这种业务稳定性要求比较高的业务,后来就发展成了用短信,就是公司买个短信机,提供一个http接口,然后运维人员写脚本把收集到的异常数据写入文件,然后脚本实时检测如果这个文件不为空,就调用短信机接口把文件里的内容发送出去,

  • 基于Python的接口测试框架实例

    背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter.SoupUI等学习周期有点长,干脆自己写一个吧,不求人,所有功能自己都能一清二楚. 当然,写工具造轮子只是学习的一种方式,现成成熟的工具肯定比我们自己的写的好用. 开发环境 ------------------------------------------------------------- 操作系统:Mac OS X EI

  • 详解Python程序与服务器连接的WSGI接口

    了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给浏览器: 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示. 所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回.Apache.Nginx.Lighttpd等这些常见的静态服务器就是干这件事情的. 如果要动

  • 深入解析Python中的WSGI接口

    概述 WSGI接口包含两方面:server/gateway 及 application/framework. server调用由application提供的可调用对象. 另外在server和application之间还可能有一种称作middleware的中间件. 可调用对象是指:函数.方法.类或者带有callable方法的实例. 关于application 函数.方法.类及带有callable方法的实例等可调用对象都可以作为the application object. WSGI协议要求: th

  • 使用python实现接口的方法

    接口基础知识: 简单说下接口测试,现在常用的2种接口就是http api和rpc协议的接口,今天主要说:http api接口是走http协议通过路径来区分调用的方法,请求报文格式都是key-value形式,返回报文一般是json串: 接口协议:http.webservice.rpc等. 请求方式:get.post方式 请求参数格式: a. get请求都是通过url?param=xxx&param1=xxx b. post请求的请求参数常用类型有:application/json.applicat

  • python 调用有道api接口的方法

    初学python ,研究了几天,写了一个python 调用 有道api接口程序 效果看下图: 申明:代码仅供和我一样的初学者学习交流 有道api申请地址http://fanyi.youdao.com/openapi?path=data-mode 申请很简单的 ps:审核不用花时间的,请勿滥用!! #-*- coding: UTF-8 -*- import urllib import urllib2 import requests import json import sys reload(sys

  • Python http接口自动化测试框架实现方法示例

    本文实例讲述了Python http接口自动化测试框架实现方法.分享给大家供大家参考,具体如下: 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值 输出:XML文件 eg:http://xxx.com/xxx_product/test/content_book_list.jsp?listid=1 二.实现方法 1.选用Python脚本来驱动测试 2.采用Excel表格管理测试数据,包括用例的管理.测试数据录入.测试结果显示等等,这个需要封装一个E

  • 详解Python用户登录接口的方法

    Readme: blog address: 摘要:编写登录接口 输入用户名.密码 认证成功后显示欢迎信息 输错3次后锁定 关键词:循环:判断:外部数据读写:列表:字典: 展望:可以结合数据库读写. codes: # Author: Steven Zeng ''' 作业2:编写登录接口 输入用户名密码 认证成功后显示欢迎信息 输错3次后锁定 ''' print("welcome to here") f1=open('username.txt') f2=open('password.txt

  • docker-py 用Python调用Docker接口的方法

    官方文档:[https://docker-py.readthedocs.io/en/stable/images.html] 众所周知,Docker向外界提供了一个API来管理其中的资源.这个API可以是socket文件形式的(一般也是默认的,在/var/run/docker.sock中),也可以是TCP形式的.以前想要通过编程的方法来调用这些API还是傻傻的用subprocess等和系统层面交互的模块来调用,而docker-py这个模块则是直接把DockerAPI的调用封装了进去,让我们可以更加

  • python用post访问restful服务接口的方法

    具体代码如下: import requests import json data={"ids": ["00007190","00007191"]} url="http://XXXXX" data_json = json.dumps(data) headers = {'Content-type': 'application/json'} response = requests.post(url, data=data_json,

  • python使用suds调用webservice接口的方法

    最近做接口对接,遇到了.net开发的webservice接口,因为python第一次与webservice对接,连问带查,最后使用suds库来实现了 1.安装suds mac: sudo pip install suds linux: easy_install suds 也可以通过去官网下载suds代码,再本地安装 2. 引用初始化 >>> from suds.client import Client >>> url = 'http://www.gpsso.com/we

  • python 调用Google翻译接口的方法

    一.网页分析 打开谷歌翻译链接:https://translate.google.com/ 按F12,点击network.在左侧输入"who are you" 可以看到,请求的链接为: https://translate.google.com/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&f.sid=-2609060161424095358&bl=boq_translate-webserver_202012

  • 基于Python的接口自动化读写excel文件的方法

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来很冗余和难以清晰的阅读以及维护,试想如果所有的接口测试数据都写在代码中,接口参数或者测试数据需要修改,那不得每个代码文件都要一一改动?.因此,这种不高效的模式不是我们想要的.所以,在自动化测试中就有个重要的思想:测试数据和测试脚本分离,也就是测试脚本只有一份,其中需要输入数据的地方会用变量来代替,然

  • 如何使用Python基于接口编程的方法实现

    目录 先通过一个实例来了解下接口到底解决什么问题. 定义一个接口 定义类,继承接口 Python 抽象基类的介绍 (PEP3119) 软件行业,唯一不变的就是变化.产品经理会变,产品需求会变,代码同样要跟着变. 不同的代码设计,变化所带来的工作量更是不同,有的每改一次需求,近乎一次重构,而有的只需要修改一个配置文件,或者在类里添加一行代码.当然比较好的代码设计,由于有着良好的可扩展性,高内聚,低耦合,因而易维护, 以少变应万变.如果才能有好的代码设计,就需要我们学习设计模式.今天为你分享的是在P

随机推荐