美文网首页百人计划
02-python发送http请求 py+requests

02-python发送http请求 py+requests

作者: 小鱿鱼Gun神 | 来源:发表于2018-04-20 18:36 被阅读25次

思路

获取测试数据-调用接口集方法(get/post方法)-具体处理-返回结果
这里要用到四个文件"config.py","optool.py","mylogging.py","http_requests.py"

(1) config.py: 配置文件,存放项目需要的配置信息,方便统一管理,ex:接口url信息
(2) optool.py: 封装一些简单函数
(3) mylogging.py:代码中每次使用logging的时候都需要设置输出格式信息,索性把它封装起来,让整个系统公用一个logging实例
(4) http_requests:对requests库进行封装,封装之后只提供一个方法给外部调用,这个方法在会根据你指定的发送请求的方式(get、post)来执行代码,那么在访问http接口的时候,不论是get/post协议,无论带什么参数,都直接调用这一个方法,简单方便

代码实现

#config.py
#__author__='yy'#
#coding:utf-8
#domin用于替换接口地址中测试环境下的ip
import time
domain='192.168.0.200:12307'
environ_test={'base_url':'http://192.168.0.200:12308','timeout':20}
environ_product={'base_url':'http://192.168.0.200:12307','timeout':20}
#optool.py
#-*- coding:utf-8 -*-
#__author__='yy'
from Config import environ_test
import json

#拼接url
def join_url(endpoint):
    '''
    拼接url
    :param endpoint:
    :return:
    '''
    return "/".join([environ_test.get("base_url"),endpoint])

#格式化json,返回字符串对象
def better_show_json(json_str):
    #将json对象转换为字符串并格式化
    return  json.dumps(json_str,indent=4)

if __name__ == "__main__":
    pass
#-*- coding:utf-8 -*-
#__author__='yy'

import  logging
#对logging进行封装再用
class Myloggging:
    '''
    logging的初始化操作,以类封装的形式进行
    '''
    def __init__(self):
        filename = "app.log" #日志文件地址
        self.logger = logging.getLogger(__name__)#定义对应程序模块名name,默认root
        self.logger.setLevel(logging.INFO)#必须设置,这里如果不显示设置,默认顾虑掉warning之前所有级别信息

        sh = logging.StreamHandler()#日志输出到屏幕控制台
        sh.setLevel(logging.ERROR)#设置日志等级

        fh = logging.FileHandler(filename=filename)#向filename输出日志信息
        fh.setLevel(logging.INFO)#设置日志等级

        #设置格式对象
        formatter = logging.Formatter("%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s - %(message)s")#定义日志输出格式

        #设置handler的格式对象
        sh.setFormatter(formatter)
        fh.setFormatter(formatter)

        #将handler增加到logger中
        self.logger.addHandler(sh)
        self.logger.addHandler(fh)

#日志操作对象logger,这里设置为单例,则凡是需要使用logging对象的地方都共用这个logger,节省内存
mylogger = Myloggging().logger

if __name__ == "__main__":
    mylogger.debug("debug")
    mylogger.info("info")
    mylogger.warning("warning")
    mylogger.error("error")
    mylogger.critical("critical")
#-*- coding:utf-8 -*-
#__author__='yy'
'''
requests库再封装
根据入参method发送请求,返回结果
'''
import requests
from mylogging import mylogger
from optool import *

class Rqhttp:
    #get请求,私有方法
    def __get(self,url,params=None,**kwargs):
        '''
        根据传入的数据进行get请求调用
        :param url: url地址
        :param params: get参数
        :param kwargs: 其他参数
        :return: 返回一个dict类型数据
        (1)200:请求正常,返回json格式数据
        格式:result = {"resultCode":200,"message":"请求成功,返回json格式的数据","content":responce.json()}
        (2)201:请求正常,返回string类型的数据
        格式:result = {"resultCode":201,"message":"请求成功,返回string格式数据","content": responce.text }
        (3)300: response的status code 不等于200,content为空字符串
        格式:result = {"resultCode":300, "message":"接口请求状态吗错误-非200","content":""}
        (4)400:请求过程中出现异常,content为空字符串
        格式: result = {"resultCode":400,"message":"接口请求过程出现异常","content":""}
        '''

        try:
            responce = requests.get(url,params,timeout=environ_test.get("timeout"),**kwargs)
            if responce.status_code==200:
                if"application.json" in responce.headers.get("Content-Type"):
                    result = {"resultCode":200,"message":"请求成功,返回JSON格式的数据","content":responce.json()}
                else:
                    result = {"resultCode":201,"message":"请求成功,返回string格式数据","content":responce.text}
                    #responce.text:根据接口返回的信息,会自动将原始数据转换成字符串类型的数据,格式根据headers里面来转的
            else:
                result = {"resultCode":300,"message":"接口请求状态码错误-非200","content":""}
        except BaseException as e:
            mylogger.info("[http_requests_get_info] -url=%s,**kwargs=%s"%(url,params,kwargs))#打印出get请求参数信息
            mylogger.exception(e)
            result={"resultCode":400,"message":"请求接口过程出现异常","content":""}
        finally:
            return result
    #post 方法,私有方法
    def __post(self,url,data=None,json=None,**kwargs):
        try:
            responce = requests.post(url,data=data,json=json,timeout=environ_test.get("timeout"),**kwargs)
            if responce.status_code==200:
                if "application/json" in responce.headers.get("Content-Type"):
                    result = {"resultCode":200,"message":"请求成功,返回json格式的数据","content":responce.json()}
                else:
                    result = {"resultCode":201,"message":"请求成功,返回string格式的数据","content":responce.text}
            else:
                result = {"resultCode":300,"message":"接口请求状态吗错误-非200","content":""}

        except BaseException as e:
            mylogger.info("[http_request_post_info] - url = %s,params=%s,json=%s,kwargs=%s]"%(url,data,json,kwargs))#打印出post请求参数信息
            mylogger.exception(e)
            result={"resultCode":400,"message":"接口请求过程出现异常","content":""}
        finally:
            return result
    #发送http请求,根据你传入的method参数决定执行get还是post请求
    def send_request(self,url,method='get',params=None,data=None,json=None,**kwargs):
        try:
            if method=="post":
                result = self.__post(url=url,data=data,json=json,**kwargs)
            elif method=="get":
                result = self.__get(url=url,params=params,**kwargs)
            else:
                result={"resultCode":301,"message":"传入参数值错误","content":""}
        except BaseException as  e:
            result = {"resultCode":400,"message":"接口请求过程出现异常","content":""}
            mylogger.info("def send_request(self,url=%s,method=%s,params=%s,data=%s,json=%s,**%s)"%(url,method,params,data,json,kwargs))
            mylogger.exception(e)
        return result
#发送http请求
if __name__ == "__main__":
    myhttp = Rqhttp()#实例化封装类
    new_url = join_url("TaskList/GetTaskList")#构造接口url地址
    '''
    #请求不带参数get方法
    result01 = myhttp.send_request(new_url,method="get")
    print(better_show_json(result01.get("content")))
    print(result01)
    print(result01.get("resultCode"))
    print(result01.get("message"))
    '''
    '''
    #请求带参数的get方法
    params = {"u":"admin","p":"asd123456"}
    result02 = myhttp.send_request(new_url,method="get",params=params)
    print(result02)
    print(result02.get("resultCode"))
    print(result02.get("message"))
    print(btter_show_json(result02.get("content")))
    '''
    #请求不带参数的post方法
    result03 = myhttp.send_request(new_url,method="post")
    print(result03.get("resultCode"))
    print(better_show_json(result03.get("content")))

跟着亭子青年学习接口测试

相关文章

网友评论

本文标题:02-python发送http请求 py+requests

本文链接:https://www.haomeiwen.com/subject/dmrxhftx.html