ASP.NET HttpPatch
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 HttpPatch 属性。此属性对于构建能够高效处理部分更新的 RESTful API 至关重要。
ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。HttpPatch 属性支持部分资源修改。
基本定义
ASP.NET 中的 HttpPatch 属性用于标记一个控制器操作方法,使其仅响应 HTTP PATCH 请求。PATCH 用于对资源进行部分更新。
与替换整个资源的 PUT 不同,PATCH 只应用请求中指定的更改。这使得它在部分更新方面更有效。
HttpPatch 是 ASP.NET 属性路由系统的一部分。它通常在 Web API 控制器中使用,用于实现 RESTful 部分更新操作。
ASP.NET HttpPatch 示例
以下示例演示了一个使用 HttpPatch 进行部分产品更新的 Web API 控制器。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run();
这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.JsonPatch;
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private static List<Product> _products = new()
{
new Product(1, "Laptop", 999.99m),
new Product(2, "Mouse", 19.99m),
new Product(3, "Keyboard", 49.99m)
};
[HttpPatch("{id}")]
public IActionResult PatchProduct(int id,
[FromBody] JsonPatchDocument<Product> patchDoc)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null) return NotFound();
var productToPatch = new Product(product.Id, product.Name, product.Price);
patchDoc.ApplyTo(productToPatch, ModelState);
if (!TryValidateModel(productToPatch))
{
return BadRequest(ModelState);
}
product.Name = productToPatch.Name;
product.Price = productToPatch.Price;
return NoContent();
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public Product(int id, string name, decimal price)
{
Id = id;
Name = name;
Price = price;
}
}
此控制器演示了使用 HttpPatch 和 JsonPatchDocument 进行部分更新。该方法接受一个产品 ID 和一个包含更改的补丁文档。
JsonPatchDocument 表示要应用于产品的一组操作。ApplyTo 方法将这些更改应用于原始产品的副本。
应用补丁后,我们会验证修改后的产品。如果验证通过,我们会更新原始产品。该方法成功时返回 204 No Content。
要测试此终结点,请向 /api/products/1 发送一个 PATCH 请求,并带有如下 JSON 正文:
[
{ "op": "replace", "path": "/name", "value": "Ultra Laptop" },
{ "op": "replace", "path": "/price", "value": "1099.99" }
]
此请求仅更新 ID 为 1 的产品的名称和价格,而其他属性保持不变。JSON Patch 格式已在 RFC 6902 中标准化。
来源
Microsoft ASP.NET JSON Patch 文档
在本文中,我们探讨了 ASP.NET 8 中的 HttpPatch 属性。此功能遵循最佳实践,实现了 RESTful API 中的高效部分更新。