我在使用 Web API 2 (.net 4.5.1) 时遇到问题,因为它似乎忽略了属性为整数的 PATCH 请求,但处理其他类型没有问题(我测试了字符串和十进制)。
我在http://playapi.azurewebsites.net/api/products设置了一个带有“产品”控制器的不安全测试 API 。如果您对该 URL 执行 GET 操作,您将得到类似此产品的内容:
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}
'Name' 和 'Category' 都是字符串,'Price' 是 Decimal 而 'Stock' 是 Integer。
如果您发送这些请求,它们都可以工作(更新后的实体将获得 200/OK):
- 补丁,http : //playapi.azurewebsites.net/api/products/1
{"Price": 600.00}
- 补丁,http : //playapi.azurewebsites.net/api/products/1
{"Category": "Electronics"}
但是,如果你发送这个,它会返回 200/OK,但不会进行更新并且库存保持在原始值
- 补丁,http : //playapi.azurewebsites.net/api/products/1
{"Stock": 4}
我的控制器代码是相当标准的样板代码(来自脚手架的 ODATA 控制器,但已移至标准 API 控制器):
// PATCH: api/Products/5
[AcceptVerbs("PATCH", "MERGE")]
public async Task<IHttpActionResult> PatchOrder(int id, Delta<Product> patch)
{
Validate(patch.GetEntity());
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var item = await db.Products.FindAsync(id);
if (item == null)
{
return NotFound();
}
patch.Patch(item);
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProductExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return Ok(item);
}
我的“产品”模型如下:
namespace PlayAPI.Models
{
public class Product
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public double Price { get; set; }
public int Stock { get; set; }
}
}
当我调试控制器时,我看到“补丁”对象有一个_changedProperties
集合,当我执行整数请求时,其中没有项目,但是当我执行任何其他类型的请求时,它具有我更改的键。
Web API 是否应该支持对整数属性的 PATCH 请求?如果是这样,我是否需要在服务器或客户端上做任何特别的事情才能使其工作?