当POST在URI中有Id时 - Id也应该在Body模型参数中吗? Web API

时间:2017-03-25 08:46:19

标签: asp.net-web-api asp.net-web-api2

我有一个在Web API Web服务中使用的ViewModel。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

然后我有一个ApiController,其方法如下:

[Route("api/Customer/{Id}")]
public IHttpActionResult Post(int Id, [FromBody]Customer Customer)
{
    ...Add to db, Id also exists in Customer
    return Ok();
}

客户ID在URI中可用 - 但Customer对象包含客户ID - 可以将其传递到帖子中。

这似乎是多余的 - 并且可能导致ID被放错地方。

什么是最佳做法?如果我需要从客户机构中删除Id,我该怎么办?

参考 - “将HTTP动词与任务资源一起使用” - REST成熟度模型中的第2级 - 声明应在URI中传递Id以更新或插入具有Id的任务: enter image description here

1 个答案:

答案 0 :(得分:0)

我们通常会在尝试创建新记录时调用 POST 方法,在您的情况下为“Customer”, PUT 方法为< strong>更新现有记录。但这不是强制性的。您也可以使用POST方法创建和更新现有记录。

通常,我们将自动生成的字段设置为表的Id(主键)字段。这意味着,当我们尝试添加记录时,我们不需要传递Id字段的数据。在这种情况下,您不需要在URI中传递Id,也不需要在API POST方法中为Id编写参数。

所以你的ajax方法就像这样,

$.ajax({
      url: 'myURL',
      type: "json",
      contentType: 'application/json; charset=utf-8',
      data: myFormData,
      success: function(data)
        {
         alert("success");
        }
       })

如上所述,您可以使用相同的方法(POST)添加新记录或编辑现有记录,那么这怎么可能呢?

我假设您在数据参数中的ajax代码中传递了Id值。

所以你的API Post方法就是这样,

[Route("api/Customer")] // I removed Id here
public IHttpActionResult Post([FromBody]Customer Customer)
{
   if(Customer!=null && Customer.Id==0) //You can check Id with null value
    {
     // Add a new record to Customer
    }
   else
    {
     // fetch Customer data by Customer.Id and update here
    }
   return Ok();
}

就这么简单。但是,您可以使用PUT方法编写此更新代码。

但是如果你在POST方法中将值传递给Id字段(这不是自动生成的字段),那么你也可以从POST方法中删除Id参数,你的路线就像此,

[Route("api/Customer")]

希望有所帮助:)