Qual é a vantagem de usar REST em vez de HTTP não REST?

Respostas:

162

Eu não acho que você receberá uma boa resposta para isso, em parte porque ninguém realmente concorda com o que é REST . A página da wikipedia é pesada em chavões e leve em explicação. A página de discussão vale uma olhada apenas para ver o quanto as pessoas discordam disso. Até onde eu sei, REST significa isso:

Em vez de ter URLs setter e getter nomeados aleatoriamente e usando GETpara todos os getters e POSTpara todos os setters, tentamos ter as URLs identificar os recursos e, em seguida, usar as ações de HTTP GET, POST, PUTe DELETEpara fazer coisas para eles. Então, ao invés de

GET /get_article?id=1
POST /delete_article   id=1

Você faria

GET /articles/1/
DELETE /articles/1/

E então POSTe PUTcorresponde às operações "criar" e "atualizar" (mas ninguém concorda com o caminho inverso).

Eu acho que os argumentos de cache estão errados, porque as strings de consulta geralmente são armazenadas em cache e, além disso, você realmente não precisa usá-las. Por exemplo, o django facilita algo assim, e eu não diria que era REST:

GET /get_article/1/
POST /delete_article/     id=1

Ou apenas inclua o verbo no URL:

GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/

Nesse caso, GETsignifica algo sem efeitos colaterais e POSTsignifica algo que altera os dados no servidor. Acho que este é talvez um pouco mais clara e fácil, especialmente porque você pode evitar toda a PUTversus POSTcoisa. Além disso, você pode adicionar mais verbos, se quiser, para não ficar artificialmente vinculado ao que o HTTP oferece. Por exemplo:

POST /hide/article/1/
POST /show/article/1/

(Ou seja o que for, é difícil pensar em exemplos até que eles aconteçam!)

Então, em conclusão, existem apenas duas vantagens que posso ver:

  1. Sua API da web pode ser mais limpa e fácil de entender / descobrir.
  2. Ao sincronizar dados com um site, provavelmente é mais fácil usar o REST, porque você pode apenas dizer o que synchronize("/articles/1/")quer que seja. Isso depende muito do seu código.

No entanto, acho que existem algumas grandes desvantagens:

  1. Nem todas as ações são mapeadas facilmente para CRUD (criar, ler / recuperar, atualizar, excluir). Você pode até não estar lidando com recursos de tipo de objeto.
  2. É um esforço extra para benefícios duvidosos.
  3. Confusão quanto ao caminho PUTe ao redor POST. Em inglês, eles significam coisas semelhantes ("vou colocar / publicar um aviso na parede").

Então, para concluir, eu diria: a menos que você realmente queira fazer um esforço extra ou se o seu serviço for muito bem mapeado para operações CRUD, salve o REST para a segunda versão da sua API.


Acabei de encontrar outro problema com o REST: não é fácil fazer mais de uma coisa em uma solicitação ou especificar quais partes de um objeto composto você deseja obter. Isso é especialmente importante em dispositivos móveis, onde o tempo de ida e volta pode ser significativo e as conexões não são confiáveis. Por exemplo, suponha que você esteja recebendo postagens em uma linha do tempo do facebook. A maneira REST "pura" seria algo como

GET /timeline_posts     // Returns a list of post IDs.
GET /timeline_posts/1/  // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....

O que é meio ridículo. A API do Facebook é ótima para IMO, então vamos ver o que eles fazem:

Por padrão, a maioria das propriedades do objeto é retornada quando você faz uma consulta. Você pode escolher os campos (ou conexões) que deseja retornar com o parâmetro de consulta "fields". Por exemplo, este URL retornará apenas o ID, nome e foto de Ben: https://graph.facebook.com/bgolub?fields=id,name,picture

Não tenho ideia de como você faria algo assim com o REST e, se o fizesse, ainda contaria como REST. Eu certamente ignoraria qualquer um que tentasse lhe dizer que você não deveria fazer isso (principalmente se o motivo for "porque não é REST")!

Timmmm
fonte
4
POST e PUT devem ser usados ​​pelo RFC HTTP. Nesse caso, PUT significa criar / atualizar algo em um local específico - o que ocorre depende se algo já existe no URI (e também é idempotente) enquanto POST significa que você solicita ao serviço da web que determine onde colocar o que está enviá-lo - e, em seguida, ele retorna o URI (portanto, é apenas criação). Realmente não posso reclamar do inglês, não quando está completamente desligado para usar DELETE quando se refere a algo fora do computador. No entanto, estou pensando no que fazer com relação ao problema levantado em sua edição: P
Nan L
7
O exemplo da API do Facebook parece REST para mim (na verdade, muito mais do que seus exemplos usando verbos nos URLs). Não há razão para que os parâmetros de consulta não possam ser RESTful; é apenas uma boa prática usar caminhos nos quais os dados podem ser organizados em hierarquia.
Justin Emery
5
As strings de consulta são perfeitamente RESTful, desde que você não esteja fazendo referências a recursos nelas. Costumo pensar neles mais como filtros que podem ajustar o comportamento do terminal.
Sinaesthetic
3
-1, REST é algo muito específico - como descrito por Roy Fielding quando ele o inventou. Veja esta resposta . particularmente: "O cliente precisa conhecer apenas o URI inicial e, posteriormente, escolher entre as opções fornecidas pelo servidor para navegar ou executar ações". . Basicamente, se alguma parte de uma API documenta pontos de extremidade, por exemplo, diz "dado um ID do usuário, você pode obter informações sobre o usuário /user/{id}e não é repousante. Considere: seu navegador precisa vir pré-programado sabendo como obter o HTML para uma pergunta sobre o stackoverflow página?
Claudiu
1
(continuação ...) Que outras pessoas usem mal o termo não muda o que é. Isenção de responsabilidade: ainda estou apenas aprendendo o que é REST e foi isso que clicou para mim recentemente.
Cláudio
47

Simplificando, REST significa usar HTTP do jeito que deveria ser.

Dê uma olhada na dissertação de Roy Fielding sobre o REST . Eu acho que todas as pessoas que estão desenvolvendo web devem ler.

Como uma observação, Roy Fielding também é um dos principais fatores por trás do protocolo HTTP.

Para citar alguns dos avanços:

  • Simples.
  • Você pode fazer bom uso do cache HTTP e do servidor proxy para ajudá-lo a lidar com alta carga.
  • Ajuda a organizar até um aplicativo muito complexo em recursos simples.
  • Isso facilita a utilização de seu aplicativo por novos clientes, mesmo que você não o tenha projetado especificamente para eles (provavelmente porque eles não existiam quando você criou o aplicativo).
Emil Ivanov
fonte
11
"Simples": por que o REST é mais simples que o HTTP?
Dimitri C.
5
"ajuda a organizar": Então, essa organização é mais difícil ao usar apenas GET e POST?
Dimitri C.
1
"Facilita a utilização de seu aplicativo por novos clientes": trata-se de REST vs. HTTP simples, certo?
Dimitri C.
23
A conformidade com as restrições REST definitivamente não é simples. Esticar operações comerciais complexas em quatro verbos padrão às vezes é realmente muito difícil. No entanto, quando bem feito, o resultado final pode ser simples de entender, mas chegar lá é tudo menos isso.
Darrel Miller
6
@ Dimitri: "Simples" porque fornece uma estrutura simples para trabalhar. REST é HTTP! É muito mais simples que SOAP (que até tem nome simples). "ajuda a organizar" - o conceito não é muito difícil de entender e, uma vez implementado corretamente - torna as coisas muito bem. O REST pode ser uma forma de projetar o aplicativo, e não um detalhe da implementação. Como Darrel ressalta a implementação, pode não ser fácil, mas o resultado é gratificante. "Facilita a utilização de seu aplicativo por novos clientes" - Novamente: REST é HTTP.
Emil Ivanov
31

Simplificando: NENHUM .

Sinta-se à vontade para fazer voto negativo, mas ainda acho que não há benefícios reais em relação a HTTP não REST. Todas as respostas atuais são inválidas. Argumentos da resposta atualmente mais votada:

  • Simples.
  • Você pode fazer bom uso do cache HTTP e do servidor proxy para ajudá-lo a lidar com alta carga.
  • Ajuda a organizar até um aplicativo muito complexo em recursos simples.
  • Isso facilita a utilização de seu aplicativo por novos clientes, mesmo que você não o tenha projetado especificamente para eles (provavelmente porque eles não existiam quando você criou o aplicativo).

1. Simples

Com o REST, você precisa de uma camada de comunicação adicional para os scripts do lado do servidor e do cliente => é realmente mais complicado do que o uso de HTTP não REST.

2. Cache

O armazenamento em cache pode ser controlado por cabeçalhos HTTP enviados pelo servidor. O REST não adiciona nenhum recurso ausente no REST.

3. Organização

O REST não ajuda a organizar as coisas. Ele obriga você a usar API suportado por biblioteca do lado do servidor que você está usando. Você pode organizar seu aplicativo da mesma maneira (ou melhor) quando estiver usando uma abordagem não REST. Por exemplo, consulte Model-View-Controller ou roteamento MVC .

4. Fácil de usar / implementar

Não é verdade. Tudo depende de quão bem você organiza e documenta seu aplicativo. O REST não melhorará magicamente seu aplicativo.

Petr Peller
fonte
3
normalmente, as APIs de descanso são mais fáceis de armazenar em cache, porque você separa os dados em recursos que têm o mesmo ciclo de vida (são criados e atualizados ao mesmo tempo), para que você possa armazenar e armazenar em cache de maneira confiável, enquanto as non -rest-apis geralmente retornam dados que foram foi pesadamente pós-processado ou é um conglomerado de várias entidades, dificultando o cache
Scott Schulthess
2
corrija, não é mutuamente exclusivo (você pode ter uma API não descanso que pode ser armazenada em cache), mas adotar uma abordagem de descanso para o design da API incentiva e, na prática, é definitivamente relevante, pois incentiva várias práticas recomendadas (descoberta, interfaces genéricas, cachability, modelagem inteligente de recursos )
Scott Schulthess
4
"O REST não ajuda a organizar as coisas. Obriga você a usar a API suportada pela biblioteca do servidor que você está usando." Não tenho certeza do que você quer dizer com isso. É perfeitamente possível (e não é mais difícil do que construir uma API não REST) ​​criar uma API RESTful sem usar uma estrutura extra do lado do servidor.
27615 Michael O.
2
"Com o REST, você precisa de uma camada de comunicação adicional" - farsa, você pode usar sua biblioteca HTTP existente muito bem.
Søren Boisen
1
@ SørenBoisen Esta resposta é um pouco antiga. Eu provavelmente deveria atualizá-lo para refletir mais o estado atual das coisas.
precisa saber é o seguinte
23

IMHO, a maior vantagem que o REST permite é reduzir o acoplamento cliente / servidor. É muito mais fácil evoluir uma interface REST ao longo do tempo sem interromper os clientes existentes.

Darrel Miller
fonte
4
Você poderia dar um exemplo? Obrigado!
Jan-owsankowski
3
Isso não dependeria de quão abastrada sua API não REST foi?
johnny
@johnny É possível, mas improvável. As restrições do REST foram escolhidas para permitir explicitamente a evolução independente dos componentes. Se você encontrou uma maneira de fazer isso melhor sem aplicar as mesmas restrições, tenho certeza que muitas pessoas gostariam de ouvir sobre isso.
Darrel Miller
@DarrelMiller Você pode explicar como o REST reduz o acoplamento cliente / servidor melhor do que a abordagem http não REST? Eu acredito que você está apontando para o ponto que Timmmm disse em sua resposta. Por favor, veja o meu último comentário em resposta Timmmm
emilly
Os sistemas REST da @emilly não contam com informações fora da banda para poder processar a resposta. Não há suposições que precisam ser feitas sobre o que pode retornar de uma solicitação específica. A resposta diz tudo o que você precisa saber. Isso permite que um servidor altere seu comportamento e o cliente possa estar ciente dessas alterações.
Darrel Miller
15

Descoberta

Cada recurso tem referências a outros recursos, na hierarquia ou nos links, por isso é fácil navegar. Essa é uma vantagem para o ser humano que está desenvolvendo o cliente, poupando-o de consultar constantemente os documentos e oferecer sugestões. Isso também significa que o servidor pode alterar os nomes dos recursos unilateralmente (desde que o software cliente não codifique os URLs).

Compatibilidade com outras ferramentas

Você pode entrar em qualquer parte da API ou usar o navegador da web para navegar pelos recursos. Facilita a depuração e o teste de integração.

Nomes de verbos padronizados

Permite que você especifique ações sem precisar caçar as palavras corretas. Imagine se getters OOP e setters não foram padronizados, e algumas pessoas usado retrievee defineem vez disso. Você precisaria memorizar o verbo correto para cada ponto de acesso individual. Sabendo que há apenas alguns verbos disponíveis, contadores desse problema.

Status padronizado

Se você GETpossui um recurso que não existe, pode ter certeza de obter um 404erro em uma API RESTful. Compare-o com uma API não RESTful, que pode retornar {error: "Not found"}envolto em Deus, sabe quantas camadas. Se você precisar de espaço extra para escrever uma mensagem para o desenvolvedor do outro lado, sempre poderá usar o corpo da resposta.

Exemplo

Imagine duas APIs com a mesma funcionalidade, uma após REST e a outra não. Agora imagine os seguintes clientes para essas APIs:

Repousante:

GET /products/1052/reviews
POST /products/1052/reviews       "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10

HTTP:

GET /reviews?product_id=1052
POST /post_review?product_id=1052                  "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10

Agora pense nas seguintes perguntas:

  • Se a primeira chamada de cada cliente funcionou, com que certeza você pode ter o resto também funcionará?

  • Houve uma grande atualização na API que pode ou não ter alterado esses pontos de acesso. Quanto dos documentos você terá que reler?

  • Você pode prever o retorno da última consulta?

  • Você deve editar a revisão publicada (antes de excluí-la). Você pode fazer isso sem verificar os documentos?

BoppreH
fonte
Esta não é uma lista exaustiva e contém apenas vantagens muito práticas.
BoppreH
Esta é uma resposta muito inteligente, aplaudo.
EralpB
10

Eu recomendo dar uma olhada em Como eu expliquei o descanso de Ryan Tomayko para minha esposa

Edição de terceiros

Trecho do link waybackmaschine:

Que tal um exemplo. Você é professor e deseja gerenciar os alunos:

  • em quais aulas eles estão,
  • que notas estão recebendo,
  • contatos de emergência,
  • informações sobre os livros dos quais você ensina etc.

Se os sistemas são baseados na web, então provavelmente há uma URL para cada um dos substantivos envolvidos aqui: student, teacher, class, book, room, etc. ... Se houvesse uma representação legível por máquina para cada URL, seria trivial trancar novas ferramentas no sistema, porque todas essas informações seriam consumíveis de maneira padrão. ... você poderia criar um sistema em todo o país que pudesse conversar com cada um dos sistemas escolares individuais para coletar as notas dos testes.

Cada um dos sistemas obteria informações um do outro usando um simples HTTP GET. Se um sistema precisar adicionar algo a outro sistema, ele usará um HTTP POST. Se um sistema deseja atualizar algo em outro sistema, ele usa um HTTP PUT. A única coisa que resta descobrir é como devem ser os dados.

marcgg
fonte
6
Esposa: Isso é outra coisa de robô?
Tobu
4
Este é um texto legal, mas não deu exemplos de por que seria ruim usar GET e POST para tudo.
Dimitri C.
9
É por isso que tentam descobrir por que é melhor :-)
Dimitri C.
7
A redação foi retirada.
surfen
2
@surfen waybackmachine
felickz
5

Eu sugeriria que todos que estão procurando uma resposta para essa pergunta passem por essa "apresentação de slides" .

Eu não conseguia entender o que é REST e por que é tão legal, seus prós e contras, diferenças em relação ao SOAP - mas essa apresentação de slides foi tão brilhante e fácil de entender, por isso está muito mais claro para mim agora do que antes.

DreifGenov
fonte
3

Armazenamento em cache.

Existem outros benefícios mais detalhados do REST que giram em torno da capacidade de evolução por meio de acoplamento e hipertexto frouxos, mas os mecanismos de cache são a principal razão pela qual você deve se preocupar com o HTTP RESTful.

Mike
fonte
3
Você pode dar um exemplo do que pode ser armazenado em cache e por que o cache não aconteceria com uma solução não REST?
Dimitri C.
2
@ Dimitri C .: Um link wikipedia.org/article?id=19 não seria armazenado em cache por um proxy, pois ignora os parâmetros passados ​​no URL. Por outro lado, um link wikipedia.org/REST seria armazenado em cache, entendeu?
vice
6
Se o armazenamento em cache fosse o principal benefício do REST, posso garantir que não teria passado os últimos dois anos criando serviços RESTful.
Darrel Miller
Darrel, você pode estar construindo sistemas com uma escala de distribuição na qual o acoplamento flexível é da maior importância (interessado em saber que tipo de sistemas são), mas a maioria das pessoas não é - ou está usando tecnologias (por exemplo, navegadores e html) nos quais uma grande maioria do trabalho é feito para eles.
Mike
1
Então, por que não usar GET /get_article/19/e POST /update_articlese o cache é sua preocupação? Você ainda pode fazer tudo com apenas GETe POSTe eu acredito que RESTsignifica "Use GET, POST, PUTe DELETEúnica." e não apenas "Não use cadeias de consulta". então o que eu sugeri não seria REST. Então, novamente, ninguém pode realmente concordar com o que REST é, então eu estou colocando isso em um balde com "Web 2.0".
Timmmm
3

Está escrito na dissertação de Fielding . Mas se você não quiser ler muito:

  • escalabilidade aumentada (devido a restrições de estado sem cache, cache e sistema em camadas)
  • cliente e servidor dissociados (devido a restrições de interface sem estado e uniformes)
    • clientes reutilizáveis ​​(o cliente pode usar navegadores REST gerais e semântica RDF para decidir qual link seguir e como exibir os resultados)
    • clientes sem interrupção (os clientes quebram apenas por alterações semânticas específicas do aplicativo, porque usam a semântica em vez de algum conhecimento específico da API)
inf3rno
fonte
0
  • Atribua um ID a cada "recurso"
  • Vincular as coisas
  • Use métodos padrão
  • Recursos com várias representações
  • Comunique-se apátrida

É possível fazer tudo apenas com POST e GET? Sim, é a melhor abordagem? Não por que? porque nós temos métodos padrões. Se você pensar novamente, seria possível fazer tudo usando apenas GET .. então por que deveríamos nos preocupar em usar o POST? Por causa dos padrões!

Por exemplo, hoje pensando em um modelo MVC, você pode limitar seu aplicativo a responder apenas a tipos específicos de verbos como POST, GET, PUT e DELETE. Mesmo que tudo seja emulado para POST e GET, não faz sentido ter verbos diferentes para ações diferentes?

VP.
fonte
1
"seria possível fazer tudo usando apenas GET": eu já fiz alguns experimentos com HTTP GET no Silverlight. Minha conclusão foi que as mensagens GET são consideravelmente limitadas em tamanho, enquanto as mensagens POST podem ser maiores (novamente: na configuração do Silverlight). Portanto, eu escolheria usar HTTP POST para tudo! :-)
Dimitri C.
ambas as soluções são contra os padrões. Fazer tudo via POST não é bom, especialmente para consultas. Observe que nos últimos anos todos os mecanismos de pesquisa que costumavam funcionar como GET funcionam agora como GET. Por quê? porque o método "get" tem essa capacidade de obter spider ...
VP.
0

A descoberta é muito mais fácil no REST. Temos documentos WADL (semelhantes ao WSDL em serviços tradicionais da web) que ajudarão você a anunciar seu serviço para o mundo. Você também pode usar descobertas UDDI. Com o HTTP POST e GET tradicional, as pessoas podem não conhecer seus esquemas de solicitação e resposta de mensagem para ligar para você.

Balaji
fonte
1
A descrição de um serviço da web RESTful com um documento WADL derrota uma das principais vantagens do REST, em particular todas as vantagens obtidas da hipermídia.
Thomas Eizinger
@ThomasEizinger A WADL é realmente uma coisa tão ruim? Atualmente, estamos trabalhando com outra empresa que não forneceu uma WADL no topo, ela retorna json-objects, dependendo do que a nossa solicitação contém. Eu suponho que a WADL seria útil para esclarecer as idéias.
Surfmuggle
O WADL faz um ótimo trabalho ao descrever uma API HTTP, porque foi para isso que foi projetada. Dependendo do serviço prestado pela empresa, uma WADL pode ou não ser uma boa ideia. Se o serviço não tirar proveito da hipermídia e apenas serializar alguns objetos no JSON, eles também deverão fornecer uma documentação (WADL, Swagger, etc.) sobre como o serviço funciona e o que ele espera / retorna. O WADL por si só não é ruim, apenas não é a ferramenta certa para um serviço da Web (verdadeiramente) RESTful.
Thomas Eizinger
0

Uma vantagem é que, podemos processar documentos XML de maneira não sequencial e remover dados XML de diferentes fontes, como objeto InputStream, URL, nó DOM ...

Vijay Jana
fonte
0

@Timmmm, sobre sua edição:

GET /timeline_posts     // could return the N first posts, with links to fetch the next/previous N posts

Isso reduziria drasticamente o número de chamadas

E nada impede que você crie um servidor que aceite parâmetros HTTP para indicar os valores de campo que seus clientes podem desejar ...

Mas isso é um detalhe.

Muito mais importante é o fato de você não mencionar enormes vantagens do estilo de arquitetura REST (escalabilidade muito melhor devido à falta de estado do servidor; disponibilidade muito melhor também devido à falta de estado do servidor; uso muito melhor dos serviços padrão, como cache para instância, ao usar um estilo de arquitetura REST; acoplamento muito menor entre cliente e servidor, devido ao uso de uma interface uniforme; etc. etc.)

Quanto à sua observação

"Nem todas as ações são facilmente mapeadas para CRUD (criar, ler / recuperar, atualizar, excluir)."

: um RDBMS também usa uma abordagem CRUD (SELECT / INSERT / DELETE / UPDATE) e sempre há uma maneira de representar e agir sobre um modelo de dados.

Em relação à sua sentença

"Você pode nem estar lidando com recursos de tipo de objeto"

: um design RESTful é, em essência, um design simples - mas isso NÃO significa que o design é simples. Você vê a diferença? Você precisará pensar muito nos conceitos que seu aplicativo representará e manipulará, o que deve ser feito por ele, se você preferir, para representá-lo por meio de recursos. Mas se você fizer isso, terá um design mais simples e eficiente.

Quel Qun
fonte
-1

As strings de consulta podem ser ignoradas pelos mecanismos de pesquisa.

melancólico
fonte
8
O uso da string de consulta é totalmente RESTful.
Emil Ivanov
Dimitri, alguns mecanismos de pesquisa ignoram links dinâmicos. Não tanto mais, mas ainda é desaprovado. Se você administra um site pequeno, o googlebot pode não indexar todas as suas páginas se elas tiverem um ponto de interrogação no caminho.
wisty
3
... o que é claramente falso, quando você menciona o Google: googlewebmastercentral.blogspot.com/2008/09/…
Boldewyn
-1 para cadeias de consulta não é ignorado pelos mecanismos de pesquisa. webmasters.googleblog.com/2008/09/…
bronze man