2017-09-05 29 views
0

我有一个C#方法,我已成功发布为AWS Lambda函数。它看起来像这样:如何将查询字符串值从AWS API网关传递到Lambda C#函数

public class MyClass 
{ 
    public async Task<APIGatewayProxyResponse> Test(APIGatewayProxyRequest request, ILambdaContext context) 
    { 
     return new APIGatewayProxyResponse 
     { 
      Body = "Body: " + request.Body 
        + Environment.NewLine 
        + "Querystring: " + (request.QueryStringParameters == null ? "null" : string.Join(",", request.QueryStringParameters.Keys)), 
      StatusCode = 200 
     }; 
    } 
} 

我做了以下通过Web界面来配置我的API网关:

  1. 创建一个新的API
  2. 创建一个新的资源名称为“MyClass的”和路径“/ myclass”
  3. 为资源创建新的GET方法,使用“Lambda函数”作为集成类型,并指向我的Lambda函数。

我希望能够打电话给我这样的lambda函数(不传入请求的任何指定的头): https://xxx.execute-api.us-east-2.amazonaws.com/prod/myclass?paramA=valueA&paramB=valueB

我不确定如何让我的查询字符串参数通过传递给拉姆达功能。无论我尝试什么,request.QueryStringParameters始终为空。

这里的正确程序是什么?

回答

1

好的我已经找到了问题。

APIGatewayProxyRequest是从传递给Lambda函数的JSON反序列化的对象。你可以看到,被传递给lambda函数的原始JSON,如果你接受JObject作为,而不是第一个参数:

public async Task<APIGatewayProxyResponse> Test(JObject request, ILambdaContext context) 
{ 
    return new APIGatewayProxyResponse 
    { 
     Body = request.ToString(), 
     StatusCode = 200 
    }; 
} 

因此,为了填补APIGatewayProxyRequest,在身体映射模板中指定的JSON需要匹配APIGatewayProxyRequest的属性。这里有一个架构示例(尽管它没有显示您需要的实际模板):https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

但是,使用API​​GatewayProxyRequest实际上并不是必需的。接受JObject作为Lambda函数的第一个参数比较容易,然后您可以访问任何您需要的JSON。然后,您可以使用像Vaibs的答案中描述的技术。

0

请使用“$ input.params('YourQueryStringKey')”。

您可以在API网关集成响应中创建正文映射模板,并尝试“$ input.params('YourQueryStringKey')”或直接在Lambda函数内部。

+0

嗨,那是我尝试过的一件事情 - 请问您可以更具体地了解我的身体映射模板或Lambda函数的具体含义? – cbp

+0

请看看,https://aws.amazon.com/blogs/compute/using-api-gateway-mapping-templates-to-handle-changes-in-your-back-end-apis/ –

+0

嗯,那链接已过时 - 我相信在撰写文章后,AWS界面在2016年发生了变化。不幸的是,遵循这些指令会导致相同的NullReferenceException。 – cbp

0

您需要为您的请求配置url查询字符串参数。

  1. 去API网关

  2. 点击您适当的方法即GET方法

  3. 去方法执行

  4. 在方法执行,选择URL查询字符串参数。

  5. 添加查询字符串参数一样paramA上,paramB

  6. 现在去合并请求选项卡

  7. 选择身体的映射模板,内容类型application/JSON

  8. 生成模板像下面

    { 
    "paramA": "$input.params('paramA')", 
    "paramB": "$input.params('paramB')" 
    } 
    
  9. 接受此键值在lamda函数中配对。

希望这会对您有所帮助。

+0

嗨,很抱歉,这不起作用:在Labmda函数内,request.QueryStringParameters仍为null。你之前用过C#吗? – cbp

+0

不,我尝试使用java.It与java一起工作良好。 – Vaibs

相关问题