0

所以我有这个lambda函数,它只需要输入一个用户名,然后转到dynamoDB,并抓住该表中的相应用户及其所有属性并将其记录下来。它工作得很好,当我在lambda测试。但是,当我通过SDK调用GET方法不起作用,我不明白为什么?如何使用aws api网关在android中调用GET方法?

这里是lambda中的函数。

AWS.config.update(dynamoDBConfiguration); 

var dynamodb = new AWS.DynamoDB.DocumentClient(); 
exports.handler = function(event, context, callback) 
{ 
    console.log('entered exports handler'); 
    console.log(JSON.stringify(event, null, ' ')); 

    var userTableName = "usersTable"; 

    var params = { 
     TableName : userTableName, 
     Key: { 
      "username": event.username 
     } 
     // AttributesToGet: [ 
     // 'STRING_VALUE', 
     // /* more items */ 
     // ], 
    }; 
    dynamodb.get(params, function(err, data) 
     { if (err) { 
       console.log(err); 
       callback(err); 
      } else { 
       console.log('great success: %j',data); 
       callback(null, data); 
      } 
     }); 
}; 

现在我试着来测试API getway这个功能,所以我可以在以后部署SDK,但有巨大的麻烦搞清楚了这一点IM和希望你们能帮助我了我在想念着什么!

这里是我的API enter image description here

接下来,我的方法要求我的GET方法。 enter image description here

我的合并请求 enter image description here

我的方法响应

enter image description here

其次是我的输出模式

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "username": {"type":"string"} 
    }, 
    "title": "Output" 
} 

我的合并响应 enter image description here

这里是我得到的输出,当我在Lambda测试(所以工作正常)。

{ 
    "Item": { 
    "experience": "0", 
    "displayName": "Archer", 
    "profileImageRef": "default", 
    "folders": { 
     "My Cards": { 
     "cards": {}, 
     "name": "My Cards" 
     } 
    }, 
    "birthdate": "1/1/1990", 
    "lastName": "Farooqui", 
    "username": "Archer", 
    "email": "[email protected]", 
    "firstName": "Qamar" 
    } 
} 

在android中,这里是我生成的sdk放入我的android studio。

MyUserClient SDK

@com.amazonaws.mobileconnectors.apigateway.annotation.Service(endpoint = "https://ow2zhiry2b.execute-api.us-west-2.amazonaws.com/awsTest") 

    public interface MyUserClient { 


     /** 
     * A generic invoker to invoke any API Gateway endpoint. 
     * @param request 
     * @return ApiResponse 
     */ 
     com.amazonaws.mobileconnectors.apigateway.ApiResponse execute(com.amazonaws.mobileconnectors.apigateway.ApiRequest request); 

     /** 
     * 
     * 
     * @param username 
     * @return Output 
     */ 
     @com.amazonaws.mobileconnectors.apigateway.annotation.Operation(path = "/", method = "GET") 
     Output rootGet(
       @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "username", location = "query") 
       String username); 
    } 

下面是从SDK

public class Output { 
    @com.google.gson.annotations.SerializedName("username") 
    private String username = null; 

    /** 
    * Gets username 
    * 
    * @return username 
    **/ 
    public String getUsername() { 
     return username; 
    } 

    /** 
    * Sets the value of username. 
    * 
    * @param username the new value 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

最后,我尝试实现异步任务GET方法生成的,以及我OUT输出类,但它会在日志语句中崩溃。

class gateWayAsyncTask extends AsyncTask<Void, Void, Void> 
    { 
     private String userName; 
     public gateWayAsyncTask(String userName) 
     { 
      this.userName = userName; 
     } 
     @Override 
     protected Void doInBackground(Void... params) 
     { 
      creatingUser = clientFactory.build(com.awsTest.clientsdk.MyUserClient.class); 
      userName = creatingUser.rootGet("Archer").getUsername(); 
      return null; 
      //clientFactory, and creatingUser variables are assigned in the parent class of this Async task don't worry. 
     } 
     @Override 
     public void onPostExecute(Void var) 
     { 
      Log.d("gateway","gateway succeded!"); 
      Log.d("gateway",userName); 
      Toast.makeText(getBaseContext(),userName,Toast.LENGTH_LONG).show(); 
     } 
    } 

这里是我的堆栈跟踪

12-27 12:42:48.929 29019-29019/com.daprlabs.aaron.swipedeck2 E/UncaughtException: java.lang.NullPointerException: println needs a message 
                         at android.util.Log.println_native(Native Method) 
                         at android.util.Log.d(Log.java:139) 
                         at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:313) 
                         at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:281) 
                         at android.os.AsyncTask.finish(AsyncTask.java:651) 
                         at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                         at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:148) 
                         at android.app.ActivityThread.main(ActivityThread.java:5525) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
12-27 12:42:49.169 29019-29019/com.daprlabs.aaron.swipedeck2 E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.daprlabs.aaron.swipedeck2, PID: 29019 
                       java.lang.NullPointerException: println needs a message 
                        at android.util.Log.println_native(Native Method) 
                        at android.util.Log.d(Log.java:139) 
                        at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:313) 
                        at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:281) 
                        at android.os.AsyncTask.finish(AsyncTask.java:651) 
                        at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5525) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
12-27 12:43:14.387 29295-29295/com.daprlabs.aaron.swipedeck2 D/gateway: gateway succeded! 
12-27 12:43:14.388 29295-29295/com.daprlabs.aaron.swipedeck2 E/UncaughtException: java.lang.NullPointerException: println needs a message 
                         at android.util.Log.println_native(Native Method) 
                         at android.util.Log.d(Log.java:139) 
                         at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:313) 
                         at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:281) 
                         at android.os.AsyncTask.finish(AsyncTask.java:651) 
                         at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                         at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:148) 
                         at android.app.ActivityThread.main(ActivityThread.java:5525) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
12-27 12:43:14.604 29295-29295/com.daprlabs.aaron.swipedeck2 E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.daprlabs.aaron.swipedeck2, PID: 29295 
                       java.lang.NullPointerException: println needs a message 
                        at android.util.Log.println_native(Native Method) 
                        at android.util.Log.d(Log.java:139) 
                        at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:313) 
                        at com.daprlabs.aaron.zivitApp.Cognito.LogInZivit$gateWayAsyncTask.onPostExecute(LogInZivit.java:281) 
                        at android.os.AsyncTask.finish(AsyncTask.java:651) 
                        at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5525) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

UPDATE

所以,当我看着云手表。它确实表明我的lambda函数被调用并执行。但是,我没有得到回报价值。所以我的方法响应和/或集成响应有些问题,但我不确定是什么。

回答

1

看起来您的集成响应中的模板为空,并且Lambda输出与您的输出模型不匹配。在集成响应页面的Body Mapping Templates下,选择左侧的application/json。在右手边,输入模板的身体是这样的:

 

    { 
     "username": $input.json('$.username') 
    } 

此外,可以尝试测试API网关通过测试GET方法执行API网关控制台上。如果仍有问题,请发布测试调用的“日志”输出。

+0

感谢您的回复。是的,就是这样。我看到你在使用AWS。在这篇文章中,我有一个关于S3的问题,我希望你能回答吗? http://stackoverflow.com/questions/41404527/how-to-download-image-from-aws-s3-into-imageview/41404657#41404657 – TheQ

1

所以我解决了这个问题。感谢:@MikeD at AWS

如果有人想从 ANDROID - > API GATEWAY - > LAMBDA FUNCTION(终点,返回一个值) - > API GATEWAY - > ANDROID。

  1. 确保您的lambda函数返回某些内容(字符串或数字)。

因此,继承人一个简单的计算器lambda函数:

console.log('Loading the Calc function'); 

exports.handler = function(event, context) { 
    console.log('Received event:', JSON.stringify(event, null, 2)); 
    if (event.a === undefined || event.b === undefined || event.op === undefined) { 
     context.fail("400 Invalid Input"); 
    } 
    var res = {}; 
    res.a = Number(event.a); 
    res.b = Number(event.b); 
    res.op = event.op; 

    if (isNaN(event.a) || isNaN(event.b)) { 
     context.fail("400 Invalid Operand"); 
    } 

    switch(event.op) 
    { 
     case "+": 
     case "add": 
      res.c = res.a + res.b; 
      console.log('WORKED FROM ANDROID!'); 
      break; 
     case "-": 
     case "sub": 
      res.c = res.a - res.b; 
      break; 
     case "*": 
     case "mul": 
      res.c = res.a * res.b; 
      break; 
     case "/": 
     case "div": 
      res.c = res.b===0 ? NaN : Number(event.a)/Number(event.b); 
      break; 
     default: 
      context.fail("400 Invalid Operator"); 
      break; 
    } 
    context.succeed(res); 
}; 

需要注意的是,我返回的变量名是res。其中包含3个数字a,b和c。

现在,如果您要从Lambda - > API网关 - > Android返回。在您的集成响应中,在body mapping模板中,在application/json中,我有以下模板:

#set($allParams = $input.params()) 
{ 
    "c" : $input.json('$.c') 


} 

接下来,在您的方法响应中。确保你创建了一个模型(你可以在左边的窗格上为你的方法创建模型,如果你点击“模型”)进行设置。这里是我的输出模式:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "c": {"type":"string"} 
    }, 
    "title": "Output" 
} 

我把这个模型方法响应(重复)。并注意我的模型(在方法响应中)c以及我的集成响应中的身体映射模板。如果您愿意,您可以输入:"c": {"type":"number"}

然后当你部署你的API。它应该工作(如果你的错误来自路径:Lambda - > Api网关 - > Android)。

相关问题