2016-11-21 1 views
0

J'essaie d'intégrer AWS Api Gateway et AWS Lambda,
Je peux appeler la fonction Lambda et obtenir une réponse.
Mais lorsque j'utilise l'AWS API Gateway et appelez ma fonction Lambda à l'aide d'une méthode GET,
Je ne parviens pas à transmettre les paramètres à l'aide d'une chaîne de requête.Amazon Web Services - API Gateway

Voici mon Handler -

package example; 

import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.lambda.runtime.LambdaLogger; 
import com.amazonaws.services.lambda.runtime.Context; 

public class Hello implements RequestHandler<Request, Response>{ 
    public Response myHandler(Request request, Context context) { 

     LambdaLogger logger = context.getLogger(); 
     logger.log("received a Lambda request"); 
     logger.log("Name param contains: "+request.getName()+" Age param contains: "+request.getAge()); 
     String greetingString = String.format("Hello "+request.getName()+", you are "+request.getAge()+" years old"); 
     return new Response(greetingString); 
    } 

    public Response handleRequest(Request arg0, Context arg1) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

est ici la classe Request -

package example; 

public class Request { 
    String name; 
    String age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAge() { 
     return age; 
    } 

    public void setAge(String age) { 
     this.age = age; 
    } 

} 

est ici la classe Response -

package example; 

public class Response { 
    String greetings; 

    public String getGreetings() { 
     return greetings; 
    } 

    public void setGreetings(String greetings) { 
     this.greetings = greetings; 
    } 

    public Response(String greetings) { 
     this.greetings = greetings; 
    } 

    public Response() { 
    } 

} 

Voici mon chaîne de test pour la fonction Lambda pour laquelle je reçois une réponse positive -

{ 
    "name": "Aniruddha", 
    "age": "25" 
} 

réponse succès à l'appel Lambda -

{ 
    "greetings": "Hello Aniruddha, you are 25 years old" 
} 

Maintenant, est ici le problème,
J'ai configuré une passerelle AWS API pour une méthode Get,
paramètres de erie sont -

?name=aniruddha&age=25 

Je reçois un corps de réponse -

{ 
    "greetings": "Hello null, you are null years old" 
} 

têtes de réponse -

{"Content-Type":"application/json"} 

Journaux -

Execution log for request test-request 
Mon Nov 21 16:28:10 UTC 2016 : Starting execution for request: test-invoke-request 
Mon Nov 21 16:28:10 UTC 2016 : HTTP Method: GET, Resource Path: /aniruddhaagw 
Mon Nov 21 16:28:10 UTC 2016 : Method request path: {} 
Mon Nov 21 16:28:10 UTC 2016 : Method request query string: {name=aniruddha, age=25} 
Mon Nov 21 16:28:10 UTC 2016 : Method request headers: {} 
Mon Nov 21 16:28:10 UTC 2016 : Method request body before transformations: null 
Mon Nov 21 16:28:10 UTC 2016 : Endpoint request URI: https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:520784750730:function:aniruddhaLambda/invocations 
Mon Nov 21 16:28:10 UTC 2016 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=**************************************************************************************************************************************************************************************************************************************************************************************dfb8a3, X-Amz-Date=20161121T162810Z, x-amzn-apigateway-api-id=h0b98tua9i, X-Amz-Source-Arn=arn:aws:execute-api:us-east-1:520784750730:h0b98tua9i/null/GET/aniruddhaagw, Accept=application/json, User-Agent=AmazonAPIGateway_h0b98tua9i, Host=lambda.us-east-1.amazonaws.com} 
Mon Nov 21 16:28:10 UTC 2016 : Endpoint request body after transformations: null 
Mon Nov 21 16:28:10 UTC 2016 : Endpoint response body before transformations: {"greetings":"Hello null, you are null years old"} 
Mon Nov 21 16:28:10 UTC 2016 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=7e29d831-b007-11e6-83cc-8b56e673337e, Connection=keep-alive, Content-Length=50, Date=Mon, 21 Nov 2016 16:28:10 GMT, Content-Type=application/json} 
Mon Nov 21 16:28:10 UTC 2016 : Method response body after transformations: {"greetings":"Hello null, you are null years old"} 
Mon Nov 21 16:28:10 UTC 2016 : Method response headers: {Content-Type=application/json} 
Mon Nov 21 16:28:10 UTC 2016 : Successfully completed execution 
Mon Nov 21 16:28:10 UTC 2016 : Method completed with status: 200 

Répondre

1

Vérifiez votre demande de passerelle API et la cartographie de réponse est correcte Ref: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#input-variable-reference

En outre, ne pas oublier de déployer les changements api pour l'obtenir reflète

#set($allParams = $input.params()) 
{ 
    "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 
    } 
} 
+0

Pouvez-vous expliquer cela? J'ai aussi trouvé ça sur internet, ce qui m'a drôlement emballé - #set ($ keys = []) #foreach ($ key dans $ input.params(). Querystring.keySet()) #set ($ success = keys.add $ ($ key)) #end #foreach (touche $ en input.params de $(). headers.keySet()) #if (! $ keys.contains ($ key)) #set ($ succès = $ keys.add ($ key)) #end #end #foreach (path.keySet() $ key dans input.params de $().) #if (! clés $.contient ($ key)) #set ($ succès = $ keys.add ($ key)) #end #end { #foreach (touche $ dans les clés de $) "$ key": « util $ .escapeJavaScript ($ input.params ($ key)) "# if ($ foreach.hasNext), # fin #end } –

+0

Il itère tous les paramètres, y compris le chemin, la chaîne de requête et l'en-tête du point de terminaison de la passerelle API, puis se rend à paires de valeurs clés à. Après le traitement, ce sera quelque chose comme { "paramètres": { "chemin": { "path_name": "path_value", ...} "tête": { "HEADER_NAME": "header_value" , ...} « querystring »: { "querystring_name": "querystring_value", ... }} } – omuthu