PATCH 请求与 PUT 请求(在 ASP.NET Core Web Api 中)

问题描述 投票:0回答:1

我对补丁请求有疑问。 我们都知道 put 请求用于对象的一般更新,而 patch 请求用于次要更新。

在补丁请求中,我们不能检查填充了哪些字段并更新它们吗? 这样的话,我们就不需要再使用补丁了,对吧?

对于此代码中的示例,我们检查了空字段并且不更新它们:


        [HttpPut("{todoId}")]
        public async Task<ActionResult> UpdateTodoItem(int todoId , TodoItemUpdateDto todoDto)     
        {
            if (ModelState.IsValid)
            {
                var todo = await _context.TodoItems.FirstOrDefaultAsync(p => p.Id == todoId);

                if (todo == null)
                {
                    return NotFound();
                }

                if(todoDto.Name != null)
                    todo.Name = todoDto.Name;

                if(todoDto.Description != null)
                    todo.Description = todoDto.Description;

                if (todoDto.IsComplete != null)
                    todo.IsComplete = todoDto.IsComplete.Value;

                _context.TodoItems.Update(todo);
                await _context.SaveChangesAsync();

                return NoContent();
            }

            return BadRequest();
        }

   

    public class TodoItemUpdateDto  
    {
        [MaxLength(30 , ErrorMessage = "Name has max length 30")]
        public string? Name { get; set; }    
        public string? Description { get; set; }
        public bool? IsComplete { get; set; }

    }
c# asp.net-core-webapi httprequest http-put http-patch
1个回答
0
投票

PUT:该方法可以多次调用,效果与调用一次相同。

PUT
通常用于完全替换资源。如果仅提供部分数据,则未包含的字段通常设置为 null 或其默认值,除非明确编程。

PATCH:与

PUT
不同,
PATCH
用于进行部分更新,即仅更新请求负载中提到的字段。请求中未包含的字段应保持不变。该方法不是幂等的,这意味着后续相同的请求可能会产生不同的效果。

PUT 和 PATCH 方法用于更新现有资源。它们之间的区别在于 PUT 替换整个资源,而 PATCH 仅指定更改。在您的示例中,您正在使用 PUT 请求实现类似 PATCH 的行为。此方法检查 DTO(数据传输对象)中的特定字段是否为非空,并且仅更新数据库中的这些字段,如果未提供其他字段则保持不变。这种选择性更新机制模仿了 PATCH 请求通常会执行的操作。

更新之前检查每个字段是否非空。这可以防止用空值或默认值覆盖值,这对于不丢失客户端不打算更新的字段中的数据至关重要。在

PUT
端点下实现此模式的选择并没有错,但它是非常规的。这可能会导致 API 使用者感到困惑,他们期望
PUT
替换整个资源并
PATCH
支持部分更新。使用
PATCH
会更合适。

© www.soinside.com 2019 - 2024. All rights reserved.