一、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类型,不用转换")