操纵 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;
}
我有一个 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;
}