Web API:POST或PUT用于创建资源的新版本?

时间:2016-05-13 13:54:52

标签: c# rest http asp.net-web-api

我正在使用Web API实现RESTful服务。该服务负责管理产品。可以创建,删除和更新产品。这是我当前的Web API控制器:

[Route("api/[controller]")]
public class ProductsController : Controller
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        this._productService = productService;
    }

    [HttpGet("{id}", Name = "GetProductById")]
    public IActionResult Get(int id)
    {
        return this.Ok(this._productService.Get(id));
    }

    [HttpPost]
    public IActionResult Post([FromBody] Product product)
    {
        var newProductId = this._productService.Add(product);
        var routeValues = new
                              {
                                  controller = "Products",
                                  id = newProductId
                              };
        return this.CreatedAtRoute("GetProductById", routeValues, null);
    }

    [HttpPut("{id}")]
    public IActionResult Put(int id, [FromBody] Product product)
    {
        this._productService.Edit(product);
        return this.Ok();
    }

    [HttpDelete("{id}")]
    public IActionResult Delete(int id)
    {
        this._productService.Delete(id);
        return this.Ok();
    }

}

出现了新的要求,根据具体情况,产品会根据以下任一流程进行更新:

  1. 在数据库中创建具有新ID的产品的新修订版。最终,一旦新版本上线,之前的版本将被存档。
  2. 产品在数据库中按原样更新,无需创建新版本。因此,产品的ID将保持不变。
  3. 我的理解是PUT请求满足第2点。但是第1点呢?它应该作为PUT还是POST请求实现?我认为它应该是一个PUT请求,因为从消费的角度来看,产品正在更新,即使在幕后创建了新记录。

    如果我将它作为PUT实现,那么我的控制器中的Put方法是否应该返回产品的id,以满足上面的第1点(因为新产品版本有新的ID)?或者我应该创建两个单独的方法来满足上述每一点?

0 个答案:

没有答案