2016-03-28 15 views
3

Bir lambda işlevi ve API ağ geçidi bitiş noktası oluşturdum, böylece aldığı sorgu ve üstbilgi parametrelerini yansıtır ve yönetilebilirlik için tüm yükü JSON ile ayrıştırmak istiyorum.Lambda'da API AWS API Ağ Geçidi üstbilgisi

Alınan yükleri bu formda geçerli:

"{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}" 

el ayrıştırmak için önemsiz değil (hiçbir dizeleri kaçan yoktur). Bu biçim nedir ve bu formatı JSON'a ayrıştıran bazı düğüm lib'leri var mı?

Benim requestTemplate:

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

cevap

2

Sen (aşağı konsolda şablon damla üret yoluyla ulaşılabilir) daha kolay bir sözlüğüne değerlerini dönecek olan [Yöntem İstek passthrough] şablonu kullanmak bulabilirsiniz:

## 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

Bu konsoldaki yeni bir özellik mi? Tüm bu bilgileri "bağlam" içinde nasıl geçtiğini severim. –

+1

Teşekkürler, harika görünüyor! Ama bu açılan yer neresi? –

+0

@MarkB Bu son güncellemede konsola eklendi. Bir şablonu değiştirirken iki düşüş var. Bu yeni şablon, ** Şablon oluştur ** altında açılır ** [Yöntem İstek geçişi] ** altında kullanılabilir. –

2

bunu, event.headers.Accept-Encoding olarak Lambda fonksiyonu sizin için çözümlenir ve kullanılabilir olacak event.headers.Accept-Language vb

{ 
    "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" 
} 

Not API ağ bu haritalama şablonunu kullanırsanız Bunu kennbrodhagen'in bu soruya verilen mükemmel yanıtından anladım: How to pass a querystring or route parameter to AWS Lambda from Amazon API Gateway ve "Gateway" özelliğini eklemek için API Ağ Geçidi Aşamasını Lambda işlevinde kullanılabilir hale getirdim.