2016-06-08 42 views
7

Per qualche motivo ho difficoltà a trovare il corpo non elaborato all'interno dello event. Sta registrando il $input.body come json per un tipo di contenuto application/json. The docs say that that should contain the raw payload.Carico utile di corpo grezzo in AWS API Modello di mappatura del corpo dell' gateway

Ecco la mia integrazione Richiesta Body Mapping Template:

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

Ecco l'esempio di payload:

{ 
    "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" 
    } 
} 
  • Esiste un modo per accedere al corpo grezzo da questa richiesta?
  • C'è un modo per modificare il tipo di contenuto per accettare tutti i tipi?

risposta

0

$input.body contiene il carico utile non elaborato. Hai bisogno di mettere citazioni intorno ad esso come "rawBody": "$input.body". In caso contrario, il corpo verrà interpretato come parte del documento JSON.

+0

dovrebbe essere un commento. –

2

Il seguente post sul blog spiega in dettaglio come aggirare questo problema. https://nicholasjackson.io/2016/12/13/using-graphql-with-aws-lambda/

È scritto specificamente nel contesto di GraphQL, ma funzionerà per qualsiasi tipo di contenuto. In breve:

  • Passare alla sezione Supporto binario. Abilita il supporto binario per il tipo di supporto scelto e salva.
  • Torna al tuo metodo nella sezione Risorse e apri Richiesta di integrazione. Aggiungere/modificare il modello di mappatura del corpo per il vostro tipo di contenuto scelto e inserire il seguente:

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

  • Salva e ridistribuire l'API.

L'aggiunta del supporto binario codifica la richiesta come una stringa base64. Il modello di mappatura del corpo lo decodifica.