ASP.NET WebApi : Iniciando com MVC4 - Parte 4

watch_later 10 de mar de 2014
CRUD simples
Selecionando os livros 


O serviço de livros vai expor dois métodos "read" : uma que retorna uma lista de todos os livros, e outro que olha para um livro de identificação. O nome do método começa com "Get", de modo que por convenção ele mapeia as requisições GET. Além disso, o método não tem parâmetros, de modo que mapeia para um URI com nenhum segmento de "ID" no caminho. O segundo método também começa com "Get", mas o método tem um parâmetro chamado id. Este parâmetro é mapeado para o "id" segmento do caminho URI. O framework ASP.NET WebAPI  converte automaticamente o ID para o tipo de dados correto (int) para o parâmetro. 


Observe que GetBook lança uma exceção do tipo HttpResponseException se o ID não é válido. Essa exceção será traduzido pelo framework em um erro 404 (não encontrado).

public IEnumerable<book> GetAllBooks()
{
    return _repository.GetAll();
}

public Book GetBook(int id)
{
    Book book = _repository.Get(id);
    if (book == null)
    {
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
    return book;
}




Adicionando novos livros 

Para criar um novo livro, o cliente envia uma solicitação HTTP POST, com o novo livro no corpo da mensagem request. 

Aqui está uma simples aplicação do método:

public Book PostBook(Book book)
{
    book = _repository.Add(book);
    return book;
}


Para lidar com request POST, definimos um método cujo nome começa com "Post ...". O método tem um parâmetro do tipo Book. Por padrão, os parâmetros com tipos complexos são desserializadas do corpo da solicitação. Portanto, esperamos que o cliente nos envie uma representação serializada de um objeto Book, usando XML ou JSON para realizar a serialização. 

Esta implementação irá funcionar, mas está faltando algumas coisas para ficar completo: 
  • Código de resposta: Por padrão, a estrutura Web API define o código de status de resposta a 200 (OK). Mas de acordo com o protocolo HTTP/1.1, quando uma solicitação POST resulta na criação de um recurso, o servidor deve responder com o status 201 (Criado). 
  • Localização: Quando o servidor cria um recurso, ele deve incluir o URI do novo recurso no cabeçalho Location da resposta. 
API Web ASP.NET torna fácil de manipular a mensagem de resposta HTTP. Aqui é a implementação melhorado:

public HttpResponseMessage PostBook(Book book)
{
    book = _repository.Add(book);
    var response = Request.CreateResponse<Book>(HttpStatusCode.Created, book);
    string uri = Url.Route(null, new { id = book.Id });
    response.Headers.Location = new Uri(Request.RequestUri, uri);
    return response;
}

Observe que o tipo de retorno do método é agora HttpResponseMessage<Book>. A classe HttpResponseMessage<T> é uma representação mais eficaz e rigída de uma mensagem de resposta HTTP. O parâmetro genérico T dá o tipo CLR que será serializado para o corpo da mensagem. Isto apenas usado na versão Beta. Você vai ter erros de compilação. A nova forma de lidar com isso é através da propriedade Request em seus controladores: você vai precisar alterar qualquer tipo de retorno de HttpResponseMessage<T> para HttpResponseMessage. 

No construtor, especificamos a instância Book para serializar e o código de status HTTP para retornar:

var response = Request.CreateResponse<Book>(HttpStatusCode.Created, book);



Atualizando um livro 

Atualizando um livro com PUT é simples. Basta definir um método cujo nome começa com "Put ...":

public void PutBook(int id, Book book)
{
    book.Id = id;
    if (!_repository.Update(book))
    {
        //throw new HttpResponseException(HttpStatusCode.NotFound);
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
}

Este método tem dois parâmetros, o ID livro (Book) e o livro(Book) atualizado. O parâmetro de identificação é feita a partir do caminho de URI, e o parâmetro de livro é anular do corpo do pedido. Por padrão, o framework ASP.NET Web API pegar tipos de parâmetros simples da rota e tipos complexos do corpo da request.

Deletando um livro 

Para excluir um livro, definir um método "Delete...".

public HttpResponseMessage DeleteBook(int id)
{
    _repository.Remove(id);
    return new HttpResponseMessage(HttpStatusCode.NoContent);
}

De acordo com a especificação HTTP, o método de exclusão deve ser idempotente, o que significa que vários pedidos DELETE para a mesma URI deve ter o mesmo efeito de uma única solicitação DELETE. Portanto, o método não deve retornar um código de erro se o livro já foi excluído. 

Se uma solicitação de exclusão ocorre, ele pode retornar o status 200 (OK) com um corpo-entidade que descreve o status ou status 202 (Aceito), se a exclusão ainda está pendente, ou status 204 (No Content) sem corpo da entidade. Neste exemplo, o método retorna estado 204.

Postagens da Mesma série :

Parte 1
Parte 2

Parte 3
Parte 4