如果还需要对象类型参数,如何在字符串类型的函数中传递参数?

时间:2018-12-05 13:09:51

标签: c# json amazon-web-services aws-lambda aws-serverless

我有函数处理程序

namespace AWSLambda2
{

    public class input
    {
        public string name { get; set; }
        public string email { get; set; }
    }

    public class Function
    {
        public string FunctionHandler(string data, input input)
        {   
            return input.name?.ToUpper()+", "+input.email?.ToUpper()+", "+data; 
        }
    }
}

它接受字符串类型参数和对象类型的输入。很好

对于对象类型,我可以通过:

{
    "name":"test",
    "email": "test@gmail.com"
}

但是它抛出一个错误,因为我也必须传递数据参数。在使用POSTMAN或Swagger为POST请求传递JSON有效负载的同时,如何传递它。

2 个答案:

答案 0 :(得分:2)

根据AWS Lambda Function Handler in C#

  

您将Lambda函数处理程序定义为实例或静态方法   在课堂上。如果要访问Lambda上下文对象,则为   通过定义ILambdaContext类型的方法参数可以使用   您可以用来访问有关当前信息的界面   执行,例如当前函数的名称,内存限制,   剩余执行时间并进行记录。

returnType handler-name(inputType input, ILambdaContext context) {
   ...
}
     

在语法中,请注意以下几点:

     
      
  • inputType第一个处理程序参数是处理程序的输入,   可以是事件数据(由事件源发布)或自定义输入   您提供的字符串或任何自定义数据对象。

  •   
  • returnType –如果计划同步调用Lambda函数   (使用RequestResponse调用类型),您可以返回输出   使用任何受支持的数据类型的功能。例如,   如果您将Lambda函数用作移动应用程序后端,则   同步调用它。您的输出数据类型将被序列化   转换成JSON。
      如果您打算异步调用Lambda函数(使用   事件调用类型),returnType应该为空。例如,如果   您将AWS Lambda与事件源(例如Amazon S3或Amazon SNS)一起使用,   这些事件源使用事件调用Lambda函数   调用类型。

  •   

根据 Working with Lambda Functions : Programming Model

  

您使用AWS Lambda支持的一种语言为Lambda函数编写代码。 无论选择哪种语言,都有一种常见的Lambda函数代码编写模式 ,其中包括以下核心概念:

     
      
  • 处理程序 –处理程序是AWS Lambda调用以开始执行Lambda函数的函数。创建Lambda函数时,可以标识处理程序。调用Lambda函数时,AWS Lambda通过调用处理程序函数开始执行代码。 AWS Lambda将所有事件数据作为第一个参数传递给此处理程序 。处理程序应该处理传入的事件数据,并可以在代码中调用其他任何函数/方法。
  •   
  • 上下文对象及其在运行时与Lambda交互的方式 AWS Lambda还将上下文对象作为第二个参数传递给处理程序函数 。通过此上下文对象,您的代码可以与AWS Lambda进行交互。例如,您的代码可以找到AWS Lambda终止Lambda函数之前剩余的执行时间。
      此外,对于诸如Node.js之类的语言,存在一个使用回调的异步平台。 AWS Lambda对此上下文对象提供了其他方法。您可以使用这些上下文对象方法来告诉AWS Lambda终止Lambda函数,并可以选择将值返回给调用方。
  •   
     

.....

强调我的。

所以要回答你的标题

  

如果还需要对象类型参数,如何在字符串类型的函数中传递参数?

简短回答:您不能

我建议创建一个特定模型以保存所需数据

public class SampleClass {
    public string data { get; set; }
    public Input input { get; set; }
}

并将其用于功能输入

namespace AWSLambda2 {

    public class Input {
        public string name { get; set; }
        public string email { get; set; }
    }

    public class Function {
        public string FunctionHandler(SampleClass input) {
            var data = input.data;
            var user = input.input;
            return user.name?.ToUpper()+", "+user.email?.ToUpper()+", "+data; 
        }
    }
}

与提供的示例中的显示类似

https://github.com/guitarrapc/AWSLambdaCSharpIntroduction/tree/master/src

答案 1 :(得分:0)

为什么您没有DTO来保存如下所示的两个数据,并让您的处理程序接受该类型的public string FunctionHandler(MyModel model)

public class MyModel
{
  public string Data {get; set;}
  public Input Input {get; set;}
}

我知道了,然后通过查询字符串传递了额外的数据,并像这样定义了Api处理程序

public string FunctionHandler([FromQuery]string data, [FromBody]input input)