封装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类型,不用转换")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章