如何使用 aws api 网关调用 android 中的 GET 方法?

How to call a GET method in android with aws api gateway?

所以我有这个 lambda 函数,它只接受一个用户名作为输入,然后转到 dynamoDB 并为我获取 table 中的相应用户及其所有属性并将其注销。当我在 lambda 中测试时,它工作得很好。但是,当我通过 sdk 调用 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,但我在解决这个问题时遇到了很大的麻烦,希望你们能帮助我解决我所缺少的问题!

这是我 api 中的 GET 方法

接下来,我的方法请求。

我的整合请求

我的方法响应

后面是我的输出模型

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

还有我的整合响应

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

{
  "Item": {
    "experience": "0",
    "displayName": "Archer",
    "profileImageRef": "default",
    "folders": {
      "My Cards": {
        "cards": {},
        "name": "My Cards"
      }
    },
    "birthdate": "1/1/1990",
    "lastName": "Farooqui",
    "username": "Archer",
    "email": "qteen1@gmail.com",
    "firstName": "Qamar"
  }
}

在 android 中,这是我生成并放入我的 android 工作室的 sdk。

我的用户客户端 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);
    }

这是我的输出 class 也是从 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 方法,但它一直在日志语句上崩溃。

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();
        }
    }

这是我的 stackTrace

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.access0(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.access0(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.access0(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.access0(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)

更新

所以当我看云表的时候。它确实表明我的 lambda 函数正在被调用和执行。但是,我没有得到 return 值。所以我的方法响应 and/or 集成响应有问题,但我不确定是什么。

集成响应中的模板似乎为空,Lambda 输出与您的输出模型不匹配。在集成响应页面上,Body 映射模板下,左侧 select application/json。在右侧,输入模板 body,如下所示:


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

此外,尝试通过 API 网关控制台上的测试执行来测试您的 API 网关 GET 方法。如果您仍然遇到问题,post 测试调用的 "Logs" 输出。

所以我解决了这个问题。感谢:AWS 的@MikeD[​​=16=]

如果有人想从 ANDROID -> API 网关 -> LAMBDA 函数(终点,return 一个值) -> API 网关 -> ANDROID.

  1. 确保您的 lambda 函数 return 是某种东西(字符串或数字)。

下面是一个简单的计算器 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);
};

请注意,我 return 编辑的变量名称是 res。其中包含 3 个数字 a、b 和 c。

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

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


}

接下来,在您的方法响应中。确保为方法响应创建模型(如果单击 "models",则可以在左侧窗格中为方法创建模型)并进行设置。这是我的输出模型:

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

我把这个模型放在方法响应中(重复)。并注意我的模型(在方法响应中)和我的集成响应中的 body 映射模板如何同时具有 c。如果需要,您可以输入:"c": {"type":"number"}

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