我在使用Web API 2 (.net 4.5.1)时遇到了问题,它似乎会忽略属性为整数的PATCH请求,但可以正常处理其他类型(如字符串和十进制数)。我已经设置了一个未加密的测试API,其中包含一个“products”控制器,位于http://playapi.azurewebsites.net/api/products。如果您对该URL进行GET请求,您将得到类似于此产品的返回结果:
当我调试控制器时,我发现“patch”对象有一个“_changedProperties”集合,在整数请求时没有任何项,但在进行其他任何类型的请求时,它具有我更改的键。
Web API是否应支持整数属性的PATCH请求?如果是,则需要在服务器端或客户端执行任何特殊操作才能使其正常工作吗?
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}
‘Name’和‘Category’都是字符串,‘Price’是一个十进制数,‘Stock’是一个整数。
如果您发送这些请求,它们都有效(您将获得更新实体的200/OK响应):
- PATCH,http://playapi.azurewebsites.net/api/products/1,使用
{"Price": 600.00}
- PATCH,http://playapi.azurewebsites.net/api/products/1,使用
{"Category": "Electronics"}
然而,如果您发送以下请求,则会返回200/OK,但不会进行更新,库存仍保持原始值:
- PATCH,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; }
}
}
当我调试控制器时,我发现“patch”对象有一个“_changedProperties”集合,在整数请求时没有任何项,但在进行其他任何类型的请求时,它具有我更改的键。
Web API是否应支持整数属性的PATCH请求?如果是,则需要在服务器端或客户端执行任何特殊操作才能使其正常工作吗?