一、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類型,不用轉換")