封裝post方法兼容3種入參模式(2020-2-24)

 一、post不同入參,重點需要注意參數名的變化: 

1.參數內容爲參數爲Json串時:

需要加headers參數,headers = {'Content-type': 'application/json'};

params賦值給json字段,不是data字段,json=params;

2.參數內容爲=式的形式時(包含2種格式:userName=uiui&password=123456或param={"skuId":123,"num":10})

使用默認headers,不傳headers參數;

params賦值給data字段,不是json字段,data=params;

如下圖:

# -- coding: utf-8 --
# configRequest.py主要存放自己封裝的http、websocket請求方法

import requests
from websocket import create_connection
from common.Log import logger
import json
import urllib.parse
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()

   # 封裝你自己的post方法,uri是訪問路由,params是post請求需要傳遞的參數,如果沒有參數這裏爲空
   def post(self, uri,params=''):
      url = self.url_root + uri # 拼湊訪問地址

      if len(params) > 0:  # 如果有參數
         if type(params) is not str:#過濾出json類型的參數(字典),{"name": "xiaoming","pwd": "111"}
            headers = {'Content-type': 'application/json'}
            result = requests.post(url, json=params, headers=headers).json()  # 返回request的Response結果,類型爲requests的Response類型
            res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)

         else: #字符串類型的參數,包含2種類型:'name=xiaoming&pwd=111'; 'param={"skuId":123,"num":10}
            params = dict(urllib.parse.parse_qsl(urllib.parse.urlsplit(url + params).query))  # 將一個完整的URL請求中的name=&pwd=轉換爲{'name':'xxx','pwd':'bbb'},轉換爲字典類型
            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)

      print(res)
      return res

   def run_main(self, method, uri=None, data=None,headers={}): 
      result = None
      if method == 'post':
         result = self.post(uri,data)
      # logger.info(str(result))
      elif method == 'get':
         url = self.url_root + uri + data
         result = requests.get(url)  # 返回request的Response結果,類型爲requests的Response類型
         print(type(result))
         print(result.json())
         result = json.dumps(result.json(), ensure_ascii=False, sort_keys=True, indent=2)
         print(result)
      else:
         print("method值錯誤!!!")
         logger.info("method值錯誤!!!")
      return result


if __name__ == '__main__':
   common=Common('http://localhost:8888','http') #實例化自己的Common
   result0 = common.run_main('post','/pinter/com/buy?', 'param={"skuId":123,"num":10}')
   result1 = common.run_main('post','/pinter/com/login?', 'userName=Lily&password=123456')
   result2 = common.run_main('post','/pinter/com/register?', {"userName":"test","password":"1234","gender":1,"phoneNum":"110","email":"[email protected]","address":"Beijing"})

二、 問題:直接傳入json串參數,可運行腳本成功;但讀取excel裏面相同的json串時,腳本運行失敗

原因:從excel中讀取出來的內容類型爲str,所以不會走json格式的分支,導致請求格式錯誤,執行失敗

解決:將第49行代碼的判斷改爲如下代碼

if (type(params) is dict or params.startswith('{')  ):#過濾出json風格的參數:dict類型,及以{開頭的字符串類型參數,如{"name": "xiaoming","pwd": "111"}
   try:
      params=json.loads(params)
      print("params是str類型,轉換爲dict")
   except:
      print("params是dict類型,不用轉換")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章