ZetCode

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 控制器。

Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。

Controllers/ProductsController.cs
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 正文:

示例 PATCH 请求
[
    { "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 中的高效部分更新。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年起就开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程