Как повторно использовать строковый блок в Swagger

Я пишу файл swagger для AWS API Gateway. Мне нужно использовать блок текста для интеграции для каждой конечной точки. Так сейчас выглядит одна конечная точка

'/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 необходимо повторить, как и для каждого пути. Как я могу не писать это каждый раз. Возможно ли определение строки, по крайней мере, чтобы содержать часть о 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

person cnvzmxcvmcx    schedule 06.07.2016    source источник
comment
Это может не дать прямого ответа на ваш вопрос, однако знаете ли вы, что вы можете экспортировать это как JSON со стадии шлюза API?   -  person ingh.am    schedule 01.08.2016
comment
Да, я пытаюсь сделать наоборот. У меня есть файл swagger, управляемый версиями, и система для импорта обновлений файла swagger на шлюз API с aws apigateway import-rest-api. Поскольку интеграция шлюза будет повторяться для всех конечных точек, я не хочу повторять один и тот же блок снова. Я не мог понять, как это сделать. Теперь я добавляю параграф об интеграции в процессе развертывания.   -  person cnvzmxcvmcx    schedule 01.08.2016
comment
А, ладно, извини, я неправильно понял, что ты делал. Я еще не использовал методы import api, поэтому, вероятно, не могу здесь помочь.   -  person ingh.am    schedule 01.08.2016


Ответы (1)


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

Если вы пишете спецификацию Swagger API, и она становится слишком большой, вы можете разбить ее на несколько файлов. Swagger поддерживает JSON Reference (черновик) для использования удаленных и локальных частей JSON для создания документа Swagger.

Обзор справочника JSON

Ссылка JSON использует специальный ключ $ 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
person cnvzmxcvmcx    schedule 11.08.2016
comment
Знаете ли вы, может ли это работать и для AWS API Gateway? Приведенная выше спецификация написана для Amazon AWS. Просто любопытно, хочу сделать то же самое. Мы не хотим выполнять какие-либо манипуляции со строками на нашей стороне, если это возможно, поскольку это оставляет возможность для ошибок. - person I. Cantrell; 26.04.2019
comment
Это может не сработать, потому что API Gateway принимает один файл в качестве входного AFAIK. Вы можете создать ссылку на другой файл, содержащий повторяющийся блок. В качестве шага сборки вы можете использовать json-refs. Я обновил ответ, чтобы проиллюстрировать. - person cnvzmxcvmcx; 26.04.2019