REST e Estados
Octavio Turra outubro 3, 2013 Boas práticas	1 Reply
Olá, primeiramente, o que é REST?
Basicamente é um acrônimo para Representative State Transfer, ou seja, uma forma de transferir uma representação de um determinado estado de uma aplicação. Vou explicar com OO pois é como me sinto mais confortável.
Pense em uma classe Pessoa. Ela tem Nome, Sexo e um boolean representando se ela está on-line ou não em um determinado sistema:
public class Pessoa{ public string Nome { get; set; } public char Sexo { get; set; } public bool EstaOnline { get; set; } }
public bool EstaOnline { get; set; }
Quando instanciamos esta classe, obtemos um objeto que, neste caso, vou chamar de "josecrildo", ficando da seguinte maneira:
var josecrildo = new Pessoa { Nome = "Josecrildo", Sexo = 'm', EstaOnline = true };
var josecrildo = new Pessoa {
Nome = "Josecrildo",
Sexo = 'm',
EstaOnline = true
Bom, o objeto josecrildo tem o estado determinado por suas propriedes. Podemos dizer que ele está on-line e tem sexo masculino e nome Josecrildo. Se mudarmos EstaOnline para false, temos outro estado para Josecrildo, pegou a pegada?
Assim, serviços REST foram pensados para transferir representações de estado, através de tecnologias simples, como o protocolo HTTP e pacotes de texto, ao contrário das práticas de serviços SOAP, no qual a complexidade é muito maior. Enquanto neste último é necessário definir um contrato, configurações, eventualmente protocolos específicos e uma certa burocracia, o REST utiliza apenas os mesmos princípios da exibição de páginas web.
Por consequência, um cliente do serviço que irá consumir objetos gerados à partir da classe Pessoa, fará requisições ao servidor, que retornará o conteúdo, normalmente, em função do método. Por ex:
PESSOA -> http://aplicacao/Pessoa
GET /Pessoa -> retorna uma lista de pessoas
GET /Pessoa/:id -> retorna um objeto de pessoas específica de acordo com :id (/Pessoa/10)
POST /Pessoa -> cria um novo objeto de pessoa
PUT /Pessoa/ -> substitui pessoa por outro objeto de pessoa
PATCH /Pessoa/:id -> altera o objeto de pessoa com :id
DELETE /Pessoa/:id -> exclui o objeto de pessoa com :id
OPTIONS /Pessoa -> lista os métodos disponíveis para /Pessoa
O produto resultante dessas requisições pode variar de acordo com o content-type ou ser fixo e, como resposta, o cliente irá receber o conteúdo em formato texto, representando o estado citado acima:
Representação de Josecrildo em JSON
//Em JSON { "Nome" : "Josecrildo", "Sexo" : 'm', "EstaOnline" : true }
//Em JSON
"Nome" : "Josecrildo",
"Sexo" : 'm',
"EstaOnline" : true
Representação de Josecrildo em XML
<Pessoa> <Nome>Josecrildo</Nome> <Sexo>m</Sexo> <EstaOnline>true</EstaOnline> </Pessoa>
<Nome>Josecrildo</Nome>
<EstaOnline>true</EstaOnline>
Enfim, todo sistema possui estados, que são os valores atuais de seus atributos ou propriedades e eles podem ser representados em modo texto. REST trata de transferir estes estados através de requisições HTTP, permitindo prover serviços simples e de fácil consumo.