2016-06-08 14 views
7

Z jakiegoś powodu ciężko jest uzyskać surowe ciało z poziomu event. Loguje się jako $input.body jako json dla typu zawartości . The docs say that that should contain the raw payload.Surowy ładunek treści w szablonie mapowania nadwozia bramy AWS interfejsu API

Oto moja Integracja Szablon Zapytanie Mapowanie ciała:

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

    #end 
    }, 
    "method": "$context.httpMethod", 
    "params": { 
    #foreach($param in $input.params().path.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end 

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

    #end 
    } 
} 

Oto przykład ładowność:

{ 
    "event": { 
    "body": { 
     "hello": "meow" 
    }, 
    "rawBody": { 
     "hello": "meow" 
    }, 
    "headers": { 
     "Accept": "*/*", 
     "Accept-Encoding": "gzip, deflate", 
     "Accept-Language": "en-US", 
     "Cache-Control": "no-cache", 
     "CloudFront-Forwarded-Proto": "https", 
     "CloudFront-Is-Desktop-Viewer": "true", 
     "CloudFront-Is-Mobile-Viewer": "false", 
     "CloudFront-Is-SmartTV-Viewer": "false", 
     "CloudFront-Is-Tablet-Viewer": "false", 
     "CloudFront-Viewer-Country": "US", 
     "Content-Type": "application/json", 
     "Host": "7nuy7lymef.execute-api.us-east-1.amazonaws.com", 
     "Origin": "file://", 
     "Postman-Token": "0ce7c6f4-3864-c9b4-f2db-739737b2ba49", 
     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Postman/4.2.2 Chrome/47.0.2526.73 Electron/0.36.2 Safari/537.36", 
     "Via": "1.1 1eea0bca59557555878da4d9775c509f.cloudfront.net (CloudFront)", 
     "X-Amz-Cf-Id": "SDjaGcuJ5eVkOMMCn6M3vGaVicA1fuA7h0bUYE4ARlKupO60eeYNFA==", 
     "X-Forwarded-For": "206.71.230.14, 205.251.250.135", 
     "X-Forwarded-Port": "443", 
     "X-Forwarded-Proto": "https", 
     "x_example_header": "my awesome header" 
    }, 
    "method": "POST", 
    "params": {}, 
    "query": { 
     "example_param": "myawesomeparam" 
    } 
    }, 
    "context": { 
    "callbackWaitsForEmptyEventLoop": false, 
    "logGroupName": "/aws/lambda/reggi-log-post", 
    "logStreamName": "2016/06/08/[$LATEST]aad04e0e46614c288ac8ca43d0a95076", 
    "functionName": "reggi-log-post", 
    "memoryLimitInMB": "128", 
    "functionVersion": "$LATEST", 
    "invokeid": "6e4e1e13-2dc1-11e6-a1f7-4dad3a8eb122", 
    "awsRequestId": "6e4e1e13-2dc1-11e6-a1f7-4dad3a8eb122", 
    "invokedFunctionArn": "arn:aws:lambda:us-east-1:562508364089:function:reggi-log-post" 
    } 
} 
  • Czy istnieje jakiś sposób, aby uzyskać dostęp do surowego ciała z tego wniosek?
  • Czy jest jakiś sposób zmienić typ zawartości, aby akceptować wszystkie typy?

Odpowiedz

0

$input.body zawiera surowy ładunek. Musisz umieścić w nim cytaty, takie jak "rawBody": "$input.body". W przeciwnym razie ciało zostanie zinterpretowane jako część dokumentu json.

+0

powinien być komentarz. –

2

Następujący blog szczegółowo wyjaśnia, jak ominąć ten problem. https://nicholasjackson.io/2016/12/13/using-graphql-with-aws-lambda/

Jest napisany specjalnie w kontekście GraphQL, ale będzie działał dla dowolnego typu zawartości. W skrócie:

  • Przejdź do sekcji Obsługa binarna. Włącz obsługę binarną wybranego typu multimediów i zapisz.
  • Powróć do swojej metody w sekcji Zasoby i otwórz Wniosek integracyjny. Dodaj/edytować szablon mapowania ciała dla wybranego typu zawartości i umieścić następujące:

    "rawBody": "$util.escapeJavaScript($util.base64Decode($input.body))"

  • Zapisz i przesunięcie API.

Dodanie obsługi binarnej koduje żądanie jako ciąg podstawowy64. Szablon dekodujący ciało dekoduje go.

Powiązane problemy