介面只是定義了一些方法,而沒有去實現,多用於程式設計時,只是設計需要有什麼樣的功能,但是並沒有實現任何功能,這些功能需要被另一個類(B)繼承後,由 類B去實現其中的某個功能或全部功能。
介面基礎知識:
簡單說下介面測試,現在常用的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介面返回假資料操作~~~~