swagger ui 解析类封装-python

import requests, json
from logger import logger

class SwaggerUI:#swagger-ui解析类
    def apiBaseInfoGet(self, swaggerAddress):#基础信息获取,host及operationId
        swaggerHost, operationId = '', ''
        swaggerAddr_list = str(swaggerAddress).split('/swagger-ui.html')
        swaggerHost = swaggerAddr_list[0]
        if swaggerAddr_list[1].replace('#/', ''):
            operationId = swaggerAddr_list[1].split('/')[len(swaggerAddr_list[1].split('/'))-1]
            requestType = operationId.split('Using')[1]
        logger.info("接口地址URL及operationId为:%s,%s" %(swaggerHost, operationId))
        return swaggerHost, operationId

    def swaggerJsonGet(self, swaggerHost):#通过swagger API获取所有swagger接口
        response = requests.get(str(swaggerHost) + '/v2/api-docs')
        response_dict = json.loads(response.text)
        logger.info("swagger-ui所有接口信息:%s" %json.dumps(response_dict))
        return response_dict

    def requestTypeGet(self, swaggerJsonDict, operationId):#指定swagger-ui接口requestType获取
        requestType = ""
        try:
            for key1, value1 in swaggerJsonDict.items():
                if key1=='paths':
                    for key2, value2 in value1.items():
                        for key3, value3 in value2.items():
                                for key4, value4 in value3.items():
                                    if key4=='operationId':
                                        if value4==operationId:
                                            requestType = key3
                                            logger.info("%s接口请求类型%s" %(operationId,requestType))
                                            break
                                break
                    break
        except Exception as e:
            logger.info(e)
        return requestType

    def apiInfoGet(self, swaggerJsonDict, requestType, operationId):#指定operationId的url及对应json获取
        theApiJson = {}
        url = ""
        try:
            for key1, value1 in swaggerJsonDict.items():
                if key1=='paths':
                    for key2, value2 in value1.items():
                        for key3, value3 in value2.items():
                            if key3.lower()==requestType.lower():
                                for key4, value4 in value3.items():
                                    if key4=='operationId':
                                        if value4==operationId:
                                            url = key2
                                            print(url)
                                            break
                                break
                    theApiJson = value1[url][requestType]

                    break
        except Exception as e:
            logger.info(e)
        logger.info("%s接口的url及json:%s,%s" %(operationId, url, json.dumps(theApiJson)))
        return url, theApiJson

    def contentTypeGet(self, theApiJson):#指定接口的content-type获取
        contentType = 'application/json'
        try:
            for key, value in theApiJson.items():
                if key.lower() == 'consumes':
                    contentType = ''
                    for i in range(len(value)):
                        if i==0:
                            contentType+=value[0]
                        else:
                            contentType+=',' + value[i]
                        break
                    break
        except Exception as e:
            logger.info("swagger获取content-Type属性时异常 %s,属性可能不存在" %e)
        logger.info("Content-Type:%s" %contentType)
        return contentType

    def headersGet(self, theApiJson):#指定接口的请求头获取
        global headers
        headers={}
        try:
            for key, value in theApiJson.items():
                if key.lower() == 'parameters':
                    for i in range(len(value)):
                        isHeaderParameter = False
                        headerParameterName = ''
                        headerParameterType = ''
                        for parameterKey, parameterValue in value[i].items():
                            if parameterKey.lower()=='name':
                                headerParameterName = parameterValue
                            if parameterKey.lower()=='in' and parameterValue.lower()=='header':
                                isHeaderParameter = True
                            if parameterKey.lower()=='type':
                                headerParameterType = parameterValue
                            if isHeaderParameter==True:
                                headers[headerParameterName] = headerParameterType
                    break
        except Exception as e:
            logger.info("swagger获取content-Type属性时异常 %s,属性可能不存在" %e)
        logger.info("Headers: %s" %json.dumps(headers))
        if headers == {}:
            headers = ''
        return headers

    def bodySchemaGet(self, theApiJson):#指定接口的bodySchema获取
        global bodySchema
        bodySchema={}
        try:
            for key, value in theApiJson.items():
                if key.lower() == 'parameters':
                    for i in range(len(value)):
                        isBodyParameter = False
                        for parameterKey, parameterValue in value[i].items():
                            if parameterKey.lower()=='in' and parameterValue.lower()=='body':
                                isBodyParameter = True
                            if isBodyParameter and parameterKey.lower()=='schema':
                                bodySchema = parameterValue
                                break
                    break
        except Exception as e:
            logger.info("swagger获取bodySchema属性时异常 %s,属性可能不存在" %e)
        logger.info("bodySchema:%s" %json.dumps(bodySchema))
        if bodySchema=={}:
            return False, bodySchema
        else:
            return True, bodySchema

    def queryBodyGet(self, theApiJson):#获取指定接口的queryBody
        global body
        body={}
        try:
            for key, value in theApiJson.items():
                if key.lower() == 'parameters':
                    for i in range(len(value)):
                        isQueryParameter = False
                        queryParameterName = ''
                        queryParameterType = ''
                        for parameterKey, parameterValue in value[i].items():
                            if parameterKey.lower()=='name':
                                queryParameterName = parameterValue
                            if parameterKey.lower()=='in' and parameterValue.lower()=='query':
                                isQueryParameter = True
                            if parameterKey.lower()=='type':
                                queryParameterType = parameterValue
                            if isQueryParameter==True:
                                body[queryParameterName] = queryParameterType
                    break
        except Exception as e:
            logger.info("swagger获取接口body属性时异常 %s,属性可能不存在" %e)
        logger.info("Body:%s" %json.dumps(body))
        if body == {}:
            body = ''
        return body

    def bodyGet(self, swaggerJsonDict, bodySchema):#指定接口的body获取
        body={}
        try:
            bodySchemaArray = bodySchema['$ref'].split('/')
            bodyProperty_dict = swaggerJsonDict[bodySchemaArray[1]][bodySchemaArray[2]]['properties']
            print(bodyProperty_dict)
            for key, value in bodyProperty_dict.items():
                for key1, value1 in value.items():
                    if key1.lower()=='type':
                        body[key]=value1
                        break
            logger.info("Body:%s" %json.dumps(body))
            if body == {}:
                body = ''
        except Exception as e:
            body = ''
            logger.info(e)
        return body

    def urlRequestTypeOperationIdListGet(self, swaggerJsonDict):#获取swagger所有接口的基础信息
        urlList = []
        requestTypeList = []
        operationIdList = []
        try:
            for key, value in swaggerJsonDict.items():
                if key=='paths':
                    for key1, value1 in value.items():
                        print(key1)
                        urlList.append(key1)
                        for key2, value2 in value1.items():
                            print(key2)
                            requestTypeList.append(key2)
                            for key3, value3 in value2.items():
                                if key3=='operationId':
                                    # print(value3)
                                    operationIdList.append(value3)
        except Exception as e:
            logger.info(e)
        logger.info("URL List:%s" %urlList)
        logger.info("requestType List:%s" %requestTypeList)
        logger.info("operationIdList List:%s" %operationIdList)
        return urlList, requestTypeList, operationIdList

    def headersBodyContentTypeListGet(self, swaggerJsonDict, requestTypeList, operationIdList):
    #获取swagger所有接口的header,body及contentType信息
        headersList = []
        bodyList = []
        contentTypeList = []
        try:
            for i in range(len(operationIdList)):
                url, theApiJson = self.apiInfoGet(swaggerJsonDict, requestTypeList[i], operationIdList[i])
                contentTypeList.append(self.contentTypeGet(theApiJson))
                headersList.append(self.headersGet(theApiJson))
                isBody, bodySchema = self.bodySchemaGet(theApiJson)
                body = {}
                if isBody:
                    body = self.bodyGet(swaggerJsonDict, bodySchema)
                else:
                    body = self.queryBodyGet(theApiJson)
                bodyList.append(body)
        except Exception as e:
            logger.info(e)
        logger.info("Headers List:%s" %headersList)
        logger.info("Body List:%s" %bodyList)
        logger.info("ContentType List:%s" %contentTypeList)
        return headersList, bodyList, contentTypeList

类引用:

swaggerui = SwaggerUI()
host, operationId  = swaggerui.apiBaseInfoGet("http://host:port/swagger-ui.html#/app/saveUsingPOST")
swaggerJsonDict = swaggerui.swaggerJsonGet(host)
requestType = swaggerui.requestTypeGet(swaggerJsonDict, operationId)
urlList, requestTypeList, operationIdList = swaggerui.urlRequestTypeOperationIdListGet(swaggerJsonDict)
headersList, bodyList, contentTypeList = swaggerui.headersBodyContentTypeListGet(swaggerJsonDict, requestTypeList, operationIdList)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值