ASP.NET HttpPut
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 HttpPut 属性。此属性对于构建处理资源更新的 RESTful API 至关重要。
ASP.NET 是一个跨平台框架,用于构建现代 Web 应用程序。HttpPut 属性简化了处理 HTTP PUT 请求以更新资源的过程。
基本定义
ASP.NET 中的 HttpPut 属性标记一个控制器操作方法,使其仅响应 HTTP PUT 请求。PUT 用于在服务器上更新现有资源。
当应用于操作方法时,HttpPut 指定在收到 PUT 请求时应调用该方法。它通常在路由中包含资源 ID,并在请求正文中包含更新的数据。
HttpPut 是 ASP.NET 属性路由系统的一部分。它遵循 REST 约定,即 PUT 请求是幂等的——重复调用会产生相同的结果。
ASP.NET HttpPut 示例
以下示例演示了一个使用 HttpPut 更新产品信息的 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;
[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)
};
[HttpPut("{id}")]
public IActionResult UpdateProduct(int id, [FromBody] Product updatedProduct)
{
var existingProduct = _products.FirstOrDefault(p => p.Id == id);
if (existingProduct == null) return NotFound();
existingProduct = existingProduct with
{
Name = updatedProduct.Name,
Price = updatedProduct.Price
};
_products[_products.IndexOf(_products.First(p => p.Id == id))] = existingProduct;
return NoContent();
}
}
public record Product(int Id, string Name, decimal Price);
此控制器演示了一个完整的 HttpPut 实现。该方法使用 [HttpPut("{id}")] 装饰,以处理带有 ID 参数的 PUT 请求。
该操作接受两个参数:来自路由的 ID 和来自请求正文的更新的产品数据。它首先检查产品是否存在,如果找不到则返回 404。
该示例使用 C# 9 记录类型和 with 表达式来创建产品的更新副本。然后将更新后的产品保存回列表。
该方法在成功时返回 NoContent() (HTTP 204),遵循 REST 约定。这表示请求成功,但不需要返回任何内容。
测试 HttpPut 端点
以下是如何使用 curl 测试 PUT 端点
curl -X PUT -H "Content-Type: application/json" \
-d '{"id":2,"name":"Wireless Mouse","price":24.99}' \
https://:5000/api/products/2
此命令向 ID 为 2 的产品发送 PUT 请求以进行更新。请求在请求正文中包含 JSON 格式的更新产品数据。
端点期望路由和正文中的 ID 相匹配。这是确保 URL 和正在更新的资源之间一致性的常见做法。
来源
在本文中,我们探讨了 ASP.NET 8 中的 HttpPut 属性。这一强大功能简化了用于更新资源的 RESTful 端点的创建。