2016-03-28 5 views
3

Я создал функцию лямбда-функции и конечную точку шлюза API, чтобы она эхочитала полученные параметры запроса и заголовка, и я хочу разобрать всю полезную нагрузку на JSON для управления.Parse AWS API Gateway header в Lambda

Принятые полезные нагрузки в таком виде:

"{Accept=*/*, 
Accept-Encoding=gzip, 
deflate, 
Accept-Language=nb-NO,nb;q=0.8,no;q=0.6,nn;q=0.4,en-US;q=0.2,en;q=0.2,sv;q=0.2,da;q=0.2, 
Authorization=COzTjCKD6VHTC, 
Cache-Control=no-cache, 
User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36, 
Via=1.1 7822a0bcea47c939c09def064206add3.cloudfront.net (CloudFront), X-Amz-Cf-Id=Bd_gFYsmhx0jK0eKf-3sZwwRozXtFoYC5UEFDDLKWYJkq6AR_L0Cfw==, 
X-Forwarded-For=89.8.222.70, 205.251.218.72, 
X-Forwarded-Port=443, X-Forwarded-Proto=https}" 

Это не тривиально разобрать вручную (не существует никакой возможности избежать в строках). Какой формат это, и есть ли некоторые узловые библиотеки для анализа этого формата в JSON?

Мой requestTemplate:

"requestTemplates": { 
    "application/json": "{\"httpMethod\": \"$context.httpMethod\", \"route\": \"$input.params('route')\", \"query\": \"$input.params().querystring\", \"header\": \"$input.params().header\"}" 
    }, 

ответ

2

Вы можете найти его проще использовать [Метод запрос транзитного] шаблона (доступен через Сформировать шаблон выпадающих в консоли), которая превратит значения в словарь:

## See http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html 
#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" 
    } 
} 
+0

Это новая функция в консоли? Мне нравится, как он передает всю эту информацию в «контексте». –

+1

Спасибо, куча, отлично выглядит! Но где это выпадающее меню? –

+0

@MarkB Это было добавлено в консоль в недавнем обновлении. При изменении шаблона есть два раскрывающихся списка. Этот новый шаблон доступен в диалоговом окне ** Сгенерировать шаблон **, как ** [Запрос запроса метода] **. –

2

Если вы используете этот шаблон отображения в API шлюза будет разобран для вас, и доступны в функции лямбда event.headers.Accept-Encoding, event.headers.Accept-Language и т.д.

{ 
    "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" : "$context.stage" 
} 

Примечание что я получил это от превосходного ответа kennbrodhagen на этот вопрос: How to pass a querystring or route parameter to AWS Lambda from Amazon API Gateway, и я просто добавил свойство «stage», чтобы сделать Stage Gateway Stage доступным в функции Lambda.

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