在 HTTP POST 中发送数组

Sending an Array in an HTTP POST

我想使用 HTTP POST 在请求正文中将数组作为 JSON 字符串发送:

{
    {
      A: 0,
      B: 1
    },
    {
      A: 2,
      B: 3
    }
}

我有以下数据结构:

public class Test
    {        
        [Display(Name = "A")]
        [Range(1, 2147483647)]
        [Required]        
        public int A { get; set; }
        [Display(Name = "B")]
        [Range(0, 2147483647)]
        [Required]
        public int B { get; set; }
    }

这是我的行动:

        [HttpPost]
        [ResponseType(typeof(WriteResponse))]
        [Route("Account/{clientId:int}/Test")]
        public IHttpActionResult PostEventTest(int clientId, [FromBody]Test[] test){}

当我点击这个动作时,测试参数为空。 如何通过请求体接收到某个类型的数组?

如果Test应该代表整体JSON,那就错了。即使你的完整 JSON 也是错误的,因为它不是一个数组。正确的 JSON 应该是:

{
    "list": [
      {
          "A": "0",
          "B": "1"
      },
      {
          "A": "2",
          "B": "3"
      }
    ]
}

或者像这样:

{
    "item1": {
      A: 0,
      B: 1
    },
    "Item2": {
      A: 2,
      B: 3
    }
}

为此,您的模型必须更改为。对于第一个示例,您的模型应如下所示:

public class TestModel
{
    public IList<Test> list
    { get; set; }
}

public class Test
{        
        [Display(Name = "A")]
        [Range(1, 2147483647)]
        [Required]        
        public int A { get; set; }
        [Display(Name = "B")]
        [Range(0, 2147483647)]
        [Required]
        public int B { get; set; }
}

对于第二个例子,Test class 是一样的,只有 TestModel 会改变:

public class TestModel
{
    public Test item1
    { get; set; }

    public Test item2
    { get; set; }
}

但只有第一个例子是数组。要测试您的 JSON 是否正确,请使用 jsonlint

编辑

对于我的示例,您不需要 [FromBody] 部分,因为您可以将 TestModel 作为方法的参数传递。这在我看来更好。

您发送的不是数组。它应该是这样的:

{"test":[
    {"A":"0", "B":"0"}, 
    {"A":"0", "B":"1"}, 
    {"A":"1","B":"1"}
]}

查看更多here (w3schools).