接口框架公共方法封裝學習(問題記錄2020-2-22)

一、調用Common中的方法需要先實例化類:

方法1:

common=Common('http://127.0.0.1:8888') #實例化自己的Common

result = common.run_main('post', '/login', 'name=xiaoming&pwd=111')

方法2:

UR = 'http://127.0.0.1:8888'

result = Common(UR).run_main('post', '/login',"name=xiaoming&pwd=111") # 直接在調用時實例化Common,init方法需要傳入變量,所以在實例化時需要傳入變量值

二、無法導入websocket 的 create_connection包

報錯:ImportError: cannot import name 'create_connection' from 'websocket' (unknown location)

原因:安裝了websocket ,實際應該安裝websocket-client(且需要先卸載前面安裝的websocket包)

解決:

先卸載websocket:pip3 uninstall websocket

在重新安裝websocket-client:pip3 uninstall websocket-client

三、使用自己封裝的post方法,發送請求後預期結果與實際結果不一致

原因:請求參數模式錯誤

解決:原請求result = RunMain().run_main('post', 'http://127.0.0.1:8888/login','name=xiaoming&pwd=111')

         改爲   result = RunMain().run_main('post', 'http://127.0.0.1:8888/login',{'name': 'xiaoming', 'pwd': '111'})

四、整體封裝的configRequest.py代碼如下:(方便後續進行http、websocket的接口測試)

# -- coding: utf-8 --
# configRequest.py主要存放自己封裝的http、websocket請求方法
import requests
from websocket import create_connection
from common.Log import logger
import json

logger = logger
# 定義一個common的類,它的父類是object
class Common(object):

   # common的構造函數
   def __init__(self, url_root, api_type= 'http'):
      '''
      :param api_type:接口類似當前支持http,ws,http就是http協議,ws是Websocket協議
      :param url_root: 被測系統的跟路由
      '''
      self.ws='null' #定義一個websocket變量,初始爲null
      if api_type == 'ws':
         self.ws = create_connection(url_root)
      elif api_type == 'http':
         self.url_root = url_root

      # ws協議的消息發送
   def send(self, params):
      '''
      :param params: websocket接口的參數
      :return: 訪問接口的返回值
      '''
      self.ws.send(params)
      res = self.ws.recv()
      print(res)
      return res

   # common類的析構函數,清理沒有用的資源
   def __del__(self):
      '''
      :return:
      '''
      if self.ws != 'null':
         self.ws.close()

   # 封裝你自己的get請求,uri是訪問路由,params是get請求的參數,如果沒有默認爲空
   def get(self, uri, params=''):
      # 拼湊訪問地址
      url = self.url_root + uri + params
      # 通過get請求訪問對應地址
      result = requests.get(url) # 返回request的Response結果,類型爲requests的Response類型
      res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)
      return res

   # 封裝你自己的post方法,uri是訪問路由(路徑),params是post請求需要傳遞的參數,如果沒有參數這裏爲空
   def post(self, uri, params=''):
      # 拼湊訪問地址
      url = self.url_root + uri
      if len(params) > 0:
         # 如果有參數,那麼通過post方式訪問對應的url,並將參數賦值給requests.post默認參數data
         result = requests.post(url, data=params).json() # 返回request的Response結果,類型爲requests的Response類型
         res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)
      else:
         # 如果無參數,訪問方式如下
         # 返回request的Response結果,類型爲requests的Response類型
         res = requests.post(url)
      return res

   def put(self, uri, params=None):
      '''
      封裝你自己的put方法,uri是訪問路由,params是put請求需要傳遞的參數,如果沒有參數這裏爲空
      :param uri: 訪問路由
      :param params: 傳遞參數,string類型,默認爲None
      :return: 此次訪問的response
      '''
      url = self.url_root + uri
      if params is not None:
         # 如果有參數,那麼通過put方式訪問對應的url,並將參數賦值給requests.put默認參數data
         # 返回request的Response結果,類型爲requests的Response類型
         res = requests.put(url, data=params)
      else:
         # 如果無參數,訪問方式如下;返回request的Response結果,類型爲requests的Response類型
         res = requests.put(url)
      return res

   def delete(self, uri, params=None):
      '''
         封裝你自己的delete方法,uri是訪問路由,params是delete請求需要傳遞的參數,如果沒有參數這裏爲空
         :param uri: 訪問路由
         :param params: 傳遞參數,string類型,默認爲None
         :return: 此次訪問的response
         '''
      url = self.url_root + uri
      if params is not None:
         # 如果有參數,那麼通過put方式訪問對應的url,並將參數賦值給requests.put默認參數data
         # 返回request的Response結果,類型爲requests的Response類型
         res = requests.delete(url, data=params)
      else:
         # 如果無參數,訪問方式如下; 返回request的Response結果,類型爲requests的Response類型
         res = requests.delete(url)
      return res

   def run_main(self, method, uri=None, data=None):  # 定義一個run_main函數,通過傳過來的method來進行不同的方法請求
      result = None
      if method == 'post':
         result = self.post(uri, data)
      # logger.info(str(result))
      elif method == 'get':
         result = self.get(uri, data)
      # logger.info(str(result))
      elif method == 'put':
         result = self.put(uri, data)
      # logger.info(str(result))
      elif method == 'delete':
         result = self.delete(uri, data)
      # logger.info(str(result))
      elif method == 'send':
         result = self.send(data)
      # logger.info(str(result))
      else:
         print("method值錯誤!!!")
         logger.info("method值錯誤!!!")
      return result

if __name__ == '__main__':
   # http接口
   # common=Common('http://127.0.0.1:8888','http') #實例化自己的Common
   # result = common.run_main('post', {'name': 'xiaoming', 'pwd': '111'})

   # WebSocket接口
   common = Common('ws://echo.websocket.org', 'ws')
   result = common.run_main('send',None,'Hello, World...') #通過調用run_main方法間接調用send方法
   #result = common.send('Hello, World...') #直接調用封裝的send方法
   print(result)# 打印日誌
   # 釋放WebSocket的長連接
   del common
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章