Asp.net web api WebApi-传递值数组

Asp.net web api WebApi-传递值数组,asp.net-web-api,Asp.net Web Api,我需要使用ASP.NET Web API(版本4.5.2)构建一个API。首先,我只是尝试创建一个添加一些数字的基本端点。为了做到这一点,我创建了: [RoutePrefix("api/test")] public class MyController : ApiController { [HttpGet] public IEnumerable<int> Calulate(decimal[] op1, decimal[] op2) { var results =

我需要使用ASP.NET Web API(版本4.5.2)构建一个API。首先,我只是尝试创建一个添加一些数字的基本端点。为了做到这一点,我创建了:

[RoutePrefix("api/test")]
public class MyController : ApiController
{
  [HttpGet]
  public IEnumerable<int> Calulate(decimal[] op1, decimal[] op2)
  {
    var results = new List<Calculation>();
    for (var i=0; i<op1.Length; i++) 
    {
      var calculation = new Calculation();
      calculation.Operand1 = op1[i];
      calculation.Operand2 = op2[i];
      calculation.Calculate();

      results.Add(calculation);
    }
    return results;
  }

  public class Calculation
  {
    public int Operand1 { get; set; }
    public int Operand2 { get; set; }
    public int Result { get; set; }

    public void Calculate()
    {
      this.Result = this.Operand1 + this.Operand2;
    }
  }
}

我认为(我不知道)原因是我没有正确地将值从Postman传递到API。然而,我不知道该怎么做。如何将值数组传递给API?

我认为可以作为JSON数组传递


希望这有助于在参数之前添加from[FromUri]

public IEnumerable<int> Calulate([FromUri] decimal[] op1, [FromUri] decimal[] op2)
public IEnumerable计算([FromUri]decimal[]op1[FromUri]decimal[]op2)
要强制Web API从URI读取复杂类型,请添加 参数的[FromUri]属性

简短回答 要发送小数数组,WebApi需要url签名,如: 得到

该url将[1.0,2.0]作为操作数1发送,[3.0,4.0]作为操作数2发送

长话短说 通过使用GET调用api,实际上不向服务器发送任何内容。(标题内容除外)

如果要将数据发送到服务器,您有(至少)2个选项:

选项2:如果操作是幂等的,则使用GET方法 正如William Xifaras已经指出的,指定您的输入将来自URL,以便WebApi正确解释。为此,请使用[FromUri]

    [HttpGet]
    [Route("calculate")]
    public List<Calculation> CalculateWithGet([FromUri]decimal[] Operand1, [FromUri]decimal[] Operand2)
    {
        var results = new List<Calculation>();
        for (var i = 0; i < Operand1.Length; i++)
        {
            var calculation = new Calculation();
            calculation.Operand1 = Operand1[i];
            calculation.Operand2 = Operand2[i];
            calculation.Calculate();

            results.Add(calculation);
        }
        return results;
    }

    public class Calculation
    {
        public decimal Operand1 { get; set; }
        public decimal Operand2 { get; set; }
        public decimal Result { get; set; }

        public void Calculate()
        {
            Result = this.Operand1 + this.Operand2;
        }
    }
[HttpGet]
[路线(“计算”)]
公共列表CalculateWithGet([FromUri]十进制[]操作数1,[FromUri]十进制[]操作数2)
{
var results=新列表();
for(变量i=0;i<1.Length;i++)
{
var计算=新计算();
calculation.operan1=操作数1[i];
计算操作数2=操作数2[i];
计算。计算();
结果。添加(计算);
}
返回结果;
}
公共类计算
{
公共十进制操作数1{get;set;}
公共十进制操作数2{get;set;}
公共十进制结果{get;set;}
公共空间计算()
{
结果=this.Operand1+this.Operand2;
}
}
对于REST客户端,它应该如下所示:

使用GET,数据通过URL发送 请注意,如果使用GET方法,服务器将期望从URL接收输入。因此,您应该发送如下查询: 得到

如果操作不是幂等的,则使用POST方法 由于该操作执行一些服务器端计算,我假设它可能并不总是幂等的。如果是这样,POST可能更合适

    [HttpPost]
    [Route("calculate")]
    public List<Calculation> CalculateWithPost(CalculationInputs inputs)
    {
        var results = new List<Calculation>();
        for (var i = 0; i < inputs.Operand2.Length; i++)
        {
            var calculation = new Calculation();
            calculation.Operand1 = inputs.Operand1[i];
            calculation.Operand2 = inputs.Operand2[i];
            calculation.Calculate();

            results.Add(calculation);
        }
        return results;
    }

    public class CalculationInputs
    {
        public decimal[] Operand1 { get; set; }
        public decimal[] Operand2 { get; set; }
    }

    public class Calculation
    {
        public decimal Operand1 { get; set; }
        public decimal Operand2 { get; set; }
        public decimal Result { get; set; }

        public void Calculate()
        {
            Result = this.Operand1 + this.Operand2;
        }
    }
[HttpPost]
[路线(“计算”)]
公共列表CalculateWithPost(计算输入)
{
var results=新列表();
对于(变量i=0;i
通过POST,数据通过主体发送 使用这种结构,服务器希望接收来自请求主体的输入。如果主体与函数的签名匹配,WebApi将反序列化主体

对于REST客户端,它应该如下所示:

旁注
可以找到用于生成SwaggerUI(printscreens)的nuget包。在WebAPI上运行临时测试非常有用。

哦,很抱歉……这是您的第一次测试,也许可以从简单的INT开始。。。例如,公共int计算(int op1,int op2)…看看你如何处理taht,然后一点一点地扩展。我有一个API,它接收一个对象,其中包含一个ID列表,我所说的对我有用。这就是说,这对我来说也很新鲜……所以根据经验,我会说,从简单开始,开始工作。。
    [HttpPost]
    [Route("calculate")]
    public List<Calculation> CalculateWithPost(CalculationInputs inputs)
    {
        var results = new List<Calculation>();
        for (var i = 0; i < inputs.Operand2.Length; i++)
        {
            var calculation = new Calculation();
            calculation.Operand1 = inputs.Operand1[i];
            calculation.Operand2 = inputs.Operand2[i];
            calculation.Calculate();

            results.Add(calculation);
        }
        return results;
    }

    public class CalculationInputs
    {
        public decimal[] Operand1 { get; set; }
        public decimal[] Operand2 { get; set; }
    }

    public class Calculation
    {
        public decimal Operand1 { get; set; }
        public decimal Operand2 { get; set; }
        public decimal Result { get; set; }

        public void Calculate()
        {
            Result = this.Operand1 + this.Operand2;
        }
    }