操纵 WebAPI POST

Manipulate WebAPi POST

我有一个 WebAPI POST 控制器,如下所示:

    [ResponseType(typeof(Product))]
    public async Task<IHttpActionResult> PostProduct(Product product)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Products.Add(product);
        await db.SaveChangesAsync();

        return CreatedAtRoute("DefaultApi", new { id = product.Id }, product);
    }

为了有效,它需要几个值,比如名称、价格、URL、制造商 ID、状态 ID。

但是,POST 并不总是包含 StatusID 的值,因此上述操作将失败,因为 i 不能为 null。 但是当 POST 没有发送值时,我想 'intercept' 并在代码中设置值。让我们说 int 1.

我该怎么做?

我一直在使用 DTO 从 API 中以一种漂亮且可见的方式提取数据。 DToes 也可以在 POST 中使用吗?如果是这样,如何?或者任何其他设置数据的方法,如果它不存在于 POST?

我会说创建您的产品请求模型,该模型将在您的 WebAPI 模型中定义,您可以在其中将 StatusID 定义为可为空。在收到请求后,您可以将产品请求数据映射到 ProductDto,并在该映射中根据需要设置默认值。

尽管您可以在客户端拦截请求并更新它,但我不确定是否适合您。

您应该创建一个与持久性无关的 POST 产品 class。不要使用 ORM 的生成产品 class。使用上面的示例,您应该有一个 ProductModel class,它将只包含 API 客户端可以更新的属性。然后将 DTO 映射到您的产品数据模型。

 public async Task<IHttpActionResult> PostProduct(ProductModel model)
{
   ...
   var product = db.Products.New();
   //mapping here
   product.Name = model.Name;
   product.Price = model.Price;
}