如何使用aws api网关在android中调用GET方法?
所以我有这个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和希望你们能帮助我了我在想念着什么!
我的方法响应
其次是我的输出模式
{
"$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": "[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函数被调用并执行。但是,我没有得到回报价值。所以我的方法响应和/或集成响应有些问题,但我不确定是什么。
看起来您的集成响应中的模板为空,并且Lambda输出与您的输出模型不匹配。在集成响应页面的Body Mapping Templates下,选择左侧的application/json。在右手边,输入模板的身体是这样的:
{ "username": $input.json('$.username') }
此外,可以尝试测试API网关通过测试GET方法执行API网关控制台上。如果仍有问题,请发布测试调用的“日志”输出。
所以我解决了这个问题。感谢:@MikeD at AWS
如果有人想从 ANDROID - > API GATEWAY - > LAMBDA FUNCTION(终点,返回一个值) - > API GATEWAY - > ANDROID。
- 确保您的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)。
感谢您的回复。是的,就是这样。我看到你在使用AWS。在这篇文章中,我有一个关于S3的问题,我希望你能回答吗? http://*.com/questions/41404527/how-to-download-image-from-aws-s3-into-imageview/41404657#41404657 – TheQ