代码之家  ›  专栏  ›  技术社区  ›  Fabricio Rodriguez

对于restfulapi执行的成功PUT操作,返回的正确状态码是什么?

  •  1
  • Fabricio Rodriguez  · 技术社区  · 6 年前

    使用实体框架添加带有操作的Scaffold-API控制器 向导,生成的控制器代码返回 为了行动 CreateDataAction()

        // POST: api/Items
        [HttpPost]
        public async Task<IActionResult> PostItem([FromBody] Item item)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);
    
            _context.Item.Add(item);
            await _context.SaveChangesAsync();
    
            return CreatedAtAction("GetItem", new { id = item.Id }, item);
        }
    
        // PUT: api/Items/5
        [HttpPut("{id}")]
        public async Task<IActionResult> PutItem([FromRoute] int id, [FromBody] Item item)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);
    
            if (id != item.Id)
                return BadRequest();
    
            _context.Entry(item).State = EntityState.Modified;
    
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ItemExists(id))
                    return NotFound();
                else
                    throw;
            }
    
            return NoContent();
        }
    

    我完全同意POST操作的返回值。但是,对于返回空主体的NoContent()的PUT操作,这是restfulapi的“最佳实践”吗?我的意思是,我知道它返回一个NoContent()状态码,因为主体是空的,但是如果它返回一个Ok()来表示一切正常,这难道没有更多的意义吗?在接收NoContent()状态代码时,操作是否成功似乎有点模棱两可。或者返回NoContent(),让消费应用程序知道它应该忽略主体,并假设由于没有返回错误代码,所以一切正常,这样做更正确吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nkosi    6 年前

    返回no content status仍在2xx status code范围内,所有这些都表示请求处理成功。现在返回200只不过是一个选择问题,而不是什么最佳实践 口述 在这种情况下。

    Learn REST: A RESTful Tutorial - Using HTTP Methods for RESTful Services

    PUT最常用于 更新 能力,使 包含最新更新的

    资源ID由客户端而不是服务器选择。在 不存在的资源ID。同样,请求主体包含一个资源 陈述。许多人认为这是复杂和混乱的。

    不包括资源的ID(请参阅下面的文章)。

    更新成功后,返回200(如果不返回任何内容,则返回204) 关于成功创作。回应中的主体是 在创建案例中通过位置标头返回链接,因为

    PUT不是一个安全的操作,因为它修改(或创建)了 服务器,但它是幂等的。换句话说,如果你创造或 资源仍然存在,并且仍然具有与使用时相同的状态

    例如,如果对资源调用PUT会增加一个计数器 在资源中,调用不再是幂等的。有时候 如果发生了这种情况,那么就可以用文件证明这个调用是不存在的 强烈建议对非幂等请求使用POST。