【问题标题】:How to call a GET method in android with aws api gateway?如何使用 aws api 网关在 android 中调用 GET 方法?
【发布时间】:2016-12-31 14:07:05
【问题描述】:

所以我有这个 lambda 函数,它简单地将用户名作为输入,然后转到 dynamoDB 并获取该表中的相应用户及其所有属性并将其注销。当我在 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。

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 方法,但它在日志语句中不断崩溃。

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)

更新

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

【问题讨论】:

    标签: android amazon-web-services android-studio aws-sdk aws-api-gateway


    【解决方案1】:

    您的集成响应中的模板似乎为空,并且 Lambda 输出与您的输出模型不匹配。在集成响应页面上,在 Body Mapping Templates 下,选择左侧的 application/json。在右侧,输入这样的模板正文:

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

    另外,尝试通过 API Gateway 控制台上的测试执行来测试您的 API Gateway GET 方法。如果您仍然遇到问题,请发布测试调用的“日志”输出。

    【讨论】:

    【解决方案2】:

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

    如果有人想离开 ANDROID -> API GATEWAY -> LAMBDA FUNCTION (end point, return a value) -> 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 返回。在您的集成响应中,在正文映射模板中,在 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 gateway -> Android)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 2022-11-26
      • 2019-05-26
      • 2017-04-28
      • 2017-05-12
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多