Visual Studio 如何为接受APIGatewayHttpApiV2ProxyRequest的AWS Lambda调用函数URL?

ijnw1ujt  于 7个月前  发布在  Pig
关注(0)|答案(1)|浏览(77)

我使用AWS控制台开发了一个AWS Lambda函数。这个函数的URL是https://mi7ark5tunresgw25fdjstovuq0woylg.lambda-url.us-west-1.on.aws/
可以使用AWS控制台测试此功能。
用于测试的输入JSON是:

{
  "Body": "Q0FDREJBQUItOEFBQi00QUFFLTlBQUUtNkFBQUFBQWNkM2U5"
}

函数返回一个JSON响应。
下面是Lambda函数的C#代码:

public APIGatewayHttpApiV2ProxyResponse FunctionHandler(APIGatewayHttpApiV2ProxyRequest oldKey, ILambdaContext context)
{
    JsonSerializerOptions option = new JsonSerializerOptions();
    if (oldKey.Body.Length != 48) return (new APIGatewayHttpApiV2ProxyResponse
    {
        StatusCode = (int)HttpStatusCode.NotAcceptable,
        Body = JsonSerializer.Serialize<string>(string.Empty, option),
    });

    string newKey = string.Empty;
    dcLicense.Extend(oldKey.Body, out newKey);

    return (new APIGatewayHttpApiV2ProxyResponse
    {
        StatusCode = (int)HttpStatusCode.OK,
        Body = JsonSerializer.Serialize<string>(newKey, option),
    });
}

我希望从.NET Framework 4.8应用程序调用此函数并获取输出字符串。
有简单的示例代码吗?

a14dhokn

a14dhokn1#

如果你想在公共互联网上触发Lambda函数,我假设你已经创建了一个(可公开访问的)函数URL,你可以通过从.NET Framework应用程序发出HTTP请求来轻松实现这一点。
当Lambda函数通过Function URL触发时,传入的请求是传递给Lambda的JSON对象。该对象包含各种细节,如HTTP方法、查询字符串值、请求体等。这就是定义APIGatewayHttpApiV2ProxyRequest对象将包含的内容,您已经配置了Lambda来接受。

  • 在 * API网关控制台中,您可以定义一个APIGatewayHttpApiV2ProxyRequest对象作为测试事件。您的测试事件(或者您稍微错误地称为“输入JSON”)本质上是一个APIGatewayHttpApiV2ProxyRequest对象,其Body设置为Q0F...

但是,在API网关控制台之外,我们无法手动创建测试事件。相反,AWS会将请求Map到Lambda接受的事件。
由于您只使用来自APIGatewayHttpApiV2ProxyRequestoldKey.Body)的Body,因此我们需要做的就是将Q0F...传递给API Gateway。然后,这将被Map以创建上面定义的确切的测试事件--一个Body设置为Q0F...的请求对象。
注意,其他字段,比如header,也会相应地设置,但是因为你不使用它们,所以我们不需要为HTTP请求设置它们。
这将工作:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class Program {
  public static void Main() {
    var lambdaUrl = "https://mi7ark5tunresgw25fdjstovuq0woylg.lambda-url.us-west-1.on.aws/";
    var functionInput = "Q0FDREJBQUItOEFBQi00QUFFLTlBQUUtNkFBQUFBQWNkM2U5";

    using(HttpClient httpClient = new HttpClient()) {
      var response = await httpClient.PostAsync(lambdaUrl, new StringContent(functionInput));
      if (response.IsSuccessStatusCode) {
        string responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine("Response: " + responseBody);
      } else
        Console.WriteLine("Failed to get response with status code: " + response.StatusCode);
    }
  }
}

相关问题