2016-04-07 5 views
13

Я использую API Gateway в Amazon как простой прокси-сервер для backend api. Основные причины его использования: простой способ получить ключи API и аутентификацию, отслеживание и обработку «сред».AWS API Gateway: передать все параметры

Моя проблема заключается в том, что мы просто хотим передать все параметры запроса, заголовки и т. Д. На наш сервер и позволить ему справиться с этим. Затем на обратном пути мы хотели бы вернуть клиенту соответствующий код ответа из нашей службы; не нужно явно их отображать. Насколько я понимаю, вы в значительной степени должны указать каждый параметр запроса, и если параметры изменяются или вы добавляете больше, вам нужно обновить api. Это довольно утомительно для нас во время dev/test.

Есть ли способ сказать, что Gateway просто принимает и передает любые параметры запроса, заголовки и т. Д., Так что вам не нужно явно указывать их? Тот же вопрос для ответа Коды состояния?

ответ

10

К сожалению, нет никакого способа выполнить сквозную передачу всех параметров, вы должны указать каждый из них в запросе метода. Тот же ответ для кодов состояния.

С тех пор мы начали интеграцию «прокси» для конечных точек HTTP и функций Lambda, которые будут выступать в качестве прокси для ввода запроса и отправлять все параметры плюс полезную нагрузку для интеграции. Для лямбда-функций есть предварительно построенная структура JSON, которая содержит все параметры и полезную нагрузку, а также контекст запроса и переменные этапа.

Смотрите этот документ: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource

Это является запрос особенность, которую мы имели в прошлом, и это на нашем отставании, но не ETA в это время. Я возьму это как еще один +1 для обоих сквозных функций.

+0

Отлично, спасибо! – alph486

+0

@ jack-kohn-aws Мне нужно пройти через параметр запроса фильтра. например https://api.xxx/pets?filters[search]=cute Как я могу это достичь? – rabishah

+0

+1. Это было бы большой помощью для людей, пытающихся перенести устаревшие API-интерфейсы, полные ad-hoc-конечных точек, с небольшой документацией параметров запроса. – Eric

5

Для запроса, существуют отображения легко проходить через все, это один я использовал в последнее время:

{ 
    "method": "$context.httpMethod", 
    "body" : $input.json('$'), 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "queryParams": { 
    #foreach($param in $input.params().querystring.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "pathParams": { 
    #foreach($param in $input.params().path.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #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" 
    } 
} 

Он перебирает все заголовки и параметры, чтобы отобразить все. Существует также новая функция, которая была announced yesterday, которая позволяет вам передать тело необработанного запроса.

Я думаю, что вы могли бы использовать аналогичный подход для создания универсального отображения ответов. Вы можете посмотреть на функцию отображения parseJson(), которая также была announced yesterday. Я полагаю, что новая функция parseJson() позволит вам вернуть строку, содержащую данные JSON, из вашего бэкэнд, и это легко сопоставить с ответом JSON в шлюзе API.

+0

Где это пойти? Это что-то в лямбде или где-то еще? Это не чванство от взглядов. Можете ли вы добавить еще какой-нибудь контекст к своему ответу? – EdgeCaseBerg

+1

@EdgeCaseBerg Это шаблон сопоставления запросов шлюза API AWS. Документировано здесь: http://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings.html –

1

Я считаю, что вы можете использовать HTTP-прокси особенность API шлюза - который будет принимать все параметры, как вы отправить к нему - к указанному Вами EC2 URL или любой другой URL

Смежные вопросы