如何在swagger中重用字符串块

问题描述 投票:1回答:1

我正在为AWS API Gateway编写一个swagger文件。我必须使用一个文本块来集成每个端点。这就是目前单个终点的样子

'/products/{productId}':
  get:
    tags:
      - product
    summary: Get detailed information about a product
    consumes:
      - application/json
    produces:
      - application/json
    parameters:
      - name: productId
        in: path
        required: true
        type: string
    responses:
      '200':
        description: 200 response
        schema:
          type: array
          items:
            $ref: '#/definitions/product'
      '404':
        description: product not found
        schema:
          type: array
          items:
            $ref: '#/definitions/product'
    x-amazon-apigateway-integration:
      requestTemplates:
        application/json: >
          ##  See
          http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

          ##  This template will pass through all parameters including path,
          querystring, header, stage variables, and context through to the
          integration endpoint via the body/payload

          #set($allParams = $input.params())

          {

          "body-json" : $input.json('$'),

          "params" : {

          #foreach($type in $allParams.keySet())
              #set($params = $allParams.get($type))
          "$type" : {
              #foreach($paramName in $params.keySet())
              "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
                  #if($foreach.hasNext),#end
              #end
          }
              #if($foreach.hasNext),#end
          #end

          },

          "stage-variables" : {

          #foreach($key in $stageVariables.keySet())

          "$key" : "$util.escapeJavaScript($stageVariables.get($key))"
              #if($foreach.hasNext),#end
          #end

          },

          "context" : {
              "account-id" : "$context.identity.accountId",
              "api-id" : "$context.apiId",
              "api-key" : "$context.identity.apiKey",
              "authorizer-principal-id" : "$context.authorizer.principalId",
              "caller" : "$context.identity.caller",
              "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
              "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
              "cognito-identity-id" : "$context.identity.cognitoIdentityId",
              "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
              "http-method" : "$context.httpMethod",
              "stage" : "$context.stage",
              "source-ip" : "$context.identity.sourceIp",
              "user" : "$context.identity.user",
              "user-agent" : "$context.identity.userAgent",
              "user-arn" : "$context.identity.userArn",
              "request-id" : "$context.requestId",
              "resource-id" : "$context.resourceId",
              "resource-path" : "$context.resourcePath"
              }
          }
      uri: >-
        arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:87126xxxxxxx:function:lambdatest_v3/invocations
      passthroughBehavior: never
      responses:
        default:
          statusCode: '200'
      httpMethod: POST
      type: aws

有关x-amazon-apigateway-integration的部分需要重复,因为它适用于每条路径。我怎么不一次写。是否有可能有一个字符串定义至少保持关于application/json的部分?

我尝试创建一个字符串定义,但它没有在aws导入上工作:

definitions:
  MyAPI:
    type: string
    default: >
        #Magic

        #set($allParams = $input.params())

        {

        "body-json" : $input.json('$'),

        "params" : {

        #foreach($type in $allParams.keySet())
            #set($params = $allParams.get($type))
        "$type" : {
            #foreach($paramName in $params.keySet())
            "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
                #if($foreach.hasNext),#end
            #end
        }
            #if($foreach.hasNext),#end
        #end

        },

        "stage-variables" : {

        #foreach($key in $stageVariables.keySet())

        "$key" : "$util.escapeJavaScript($stageVariables.get($key))"
            #if($foreach.hasNext),#end
        #end

        },

        "context" : {
            "account-id" : "$context.identity.accountId",
            "api-id" : "$context.apiId",
            "api-key" : "$context.identity.apiKey",
            "authorizer-principal-id" : "$context.authorizer.principalId",
            "caller" : "$context.identity.caller",
            "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
            "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
            "cognito-identity-id" : "$context.identity.cognitoIdentityId",
            "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
            "http-method" : "$context.httpMethod",
            "stage" : "$context.stage",
            "source-ip" : "$context.identity.sourceIp",
            "user" : "$context.identity.user",
            "user-agent" : "$context.identity.userAgent",
            "user-arn" : "$context.identity.userArn",
            "request-id" : "$context.requestId",
            "resource-id" : "$context.resourceId",
            "resource-path" : "$context.resourcePath"
            }
        }

然后在路径中:

  x-amazon-apigateway-integration:
    requestTemplates:
      application/json: 
        $ref: '#/definitions/MyAPI'
    uri: >-
      arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:8712xxxxxxxx:function:lambdaTest_v3/invocations
    passthroughBehavior: never
    responses:
      default:
        statusCode: '200'
    httpMethod: POST
    type: aws
amazon-web-services swagger aws-lambda swagger-2.0
1个回答
1
投票

http://azimi.me/2015/07/16/split-swagger-into-smaller-files.html

如果您正在编写Swagger API规范并且它变得太大,您可以将其拆分为多个文件。 Swagger支持JSON Reference(草稿),用于使用远程和本地JSON片段来构建Swagger文档。

JSON参考概述

JSON Reference使用特殊键$ ref来定义一段JSON的“引用”。例如,以下JSON引用了http://example.com/foo.json

编译拆分的json文件

一旦将json文件拆分为多个引用,就可以将它们与json-refs resolve命令一起编译。

json-refs resolve -I relative swagger-boot.json > docs/swagger/swaggerInternal.json
© www.soinside.com 2019 - 2024. All rights reserved.