0

поэтому у меня есть эта функция лямбда, которая просто вводит имя пользователя в качестве входных данных и переходит к dynamoDB и захватывает меня в этой таблице со всеми ее атрибутами и записывает ее. Он отлично работает, когда я тестирую лямбду. Но, когда я вызываю метод GET через sdk, он не работает, и я не понимаю, почему?Как вызвать метод GET в android с помощью aws api gateway?

здесь эта функция в лямбда.

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, но им, имеющие огромные проблемы, выясняя это и надеюсь, что вы, ребята, можете помочь мне в то, что им не хватает!

Вот мой метод GET в моем апи enter image description here

Далее, мой запрос метода. 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

И вот результат, который я получаю, когда я тестирую в Лямбда (так хорошо работает).

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

В андроиде, вот мой 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; 
    } 

} 

И, наконец, я стараюсь реализовать метод попадет в задаче асинхронной, но он продолжает сбой в журнале.

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.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

Так что, когда я смотрел на облака часы. Это показывает, что моя лямбда-функция вызывается и выполняется. Но, я не получаю возвращаемое значение. Так что что-то не так с моим ответом метода и/или интеграционным ответом, но я не уверен, что.

ответ

1

Похоже, что ваш шаблон в ответ интеграции пуст, и выход Lambda не соответствует вашей модели вывода. На странице ответа на интеграцию в шаблонах сопоставления тела выберите приложение/json с левой стороны.С правой стороны, введите тело шаблона, как это:

 

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

Кроме того, попробуйте протестировать ваш Шлюз API GET метод выполнения на API консоли шлюза с помощью теста. Если у вас все еще есть проблемы, опубликуйте вывод «Logs» из тестового вызова.

+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. Убедитесь, что ваша функция лямбда возвращает что-то (строку или число).

Так Heres простой функции калькулятора лямбда:

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.

Теперь, если вы вернетесь из Лямбды -> API-шлюз -> Android. В своем ответе интеграции, в шаблонах отображения тела, в приложении/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).