ASP .NET Core 2.2 -  Atualizando recursos com HTTP PUT


 Hoje veremos como atualizar recursos usando o atributo HttpPut em uma Web API da ASP .NET Core 2.2.

A ASP .NET Core permite criar serviços RESTful, ou seja, aderente ao estilo REST, também conhecidos como Web APIs ou APIs da Web, usando a linguagem C#.

Para lidar com as requisições, uma WEB API ASP .NET Core usa os Controllers ou controladores que são classes C# que derivam da classe ControllerBase.

Assim, os controladores devem derivar da classe ControllerBase e não da classe Controller.

A classe Controller (que é derivada da classe ControllerBase) inclui suporte a views e à manipulação de páginas web e não à requisições de uma WEB API.

Já a classe ControllerBase fornece muitas propriedades e métodos para tratar com requisições HTTP.

A seguir temos alguns métodos fornecidos pela classe ControllerBase:

Para usar os últimos cenários de roteamento no ASP.NET Core 2.2, especifique a versão de compatibilidade com o registro de serviços MVC em Startup.ConfigureServices:

...
  services.AddMvc()
      .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
...

Atualizando um recurso com HttpPut

Ao atualizar um recurso existente usando o método HTTP Put, ele deve estar completo, ou seja, devemos atualizar todos os campos do recurso, e, para isso, temos que receber todos os dados do recurso.

A resposta desta operação deve ser um código de status200 OK ou um 204 No Content.

Segundo a lista de código de status HTTP temos que:

No trecho de código a seguir temos um controlador relacionado com clientes, chamado ClientesController, que atualiza dados de um cliente.

[Route("v1/clientes")]
[HttpPut("{id}")
public async Task<ActionResult> Put(int id, [FromBody] Cliente cliente)
{
       if (cliente.ClienteId != id){
        return BadRequest();
    }
    _context.Entry(cliente).State =  EntityState.Modified;
    await _context.SaveChangesAsync();
    return NoContent();
}

No método Action Put usamos o atributo HttpPut definindo o parâmetro id que deverá ser recebido no request. Definimos a rota como 'v1/clientes'.

No código o atributo [FromBody] indica que a informação do cliente vem no body da requisição HTTP.

A seguir verificamos se o parâmetro id recebido coincide com o id do cliente (ClienteId) enviado no body do request. Se não coincidir retornamos um código de status 400 Bad Request.

A seguir marcamos o objeto cliente como modificado e a seguir atualizamos os dados usando o método assíncrono SaveChangesAsync().

Qual o retorno que um método HTTP PUT deve ter ?

O retorno deve ser o status code : 200 OK ou 204 No Content.

No exemplo estamos retornando 204 No Content, para retornar 200 Ok a linha de código do return ficaria assim:

[Route("v1/clientes")]
[HttpPut("{id}")
public async Task<ActionResult> Put(int id, [FromBody] Cliente cliente)
{
       if (cliente.ClienteId != id){
        return BadRequest();
    }
    _context.Entry(cliente).State =  EntityState.Modified;
    await _context.SaveChangesAsync();
    return Ok();
}

Nota: Podemos aplicar o atributo [ApiController] a uma classe do controlador para habilitar comportamentos específicos da WEB API. Usando este atributo não precisamos utilizar os atributos [FromBody] nem realizar a validação do ModelState.

Assim usamos o HTTP PUT para fazer uma atualização completa de um recurso. Uma desvantagem dessa abordagem é que precisamos que o usuário envie todos os campos do recurso para poder realizar a atualização.

Para podermos realizar uma atualização parcial e assim não precisar receber todos os campos devemos usar o método HTTP PATCH.

Vamos ver isso na próxima parte do artigo.

"Eu sou o caminho a verdade e a vida. Ninguém vem a o Pai a não ser por Mim." (Jesus)

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti