O que exatamente é a programação RESTful?
O que exatamente é a programação RESTful?
Respostas:
Um estilo de arquitetura chamado REST (Representational State Transfer) defende que os aplicativos da Web usem HTTP como originalmente previsto . As pesquisas devem usar GET
solicitações. PUT
, POST
, E DELETE
os pedidos devem ser usados para mutação, criação e eliminação, respectivamente .
Os proponentes do REST tendem a favorecer URLs, como
http://myserver.com/catalog/item/1729
mas a arquitetura REST não requer esses "URLs bonitos". Uma solicitação GET com um parâmetro
http://myserver.com/catalog?item=1729
é tão RESTful.
Lembre-se de que as solicitações GET nunca devem ser usadas para atualizar informações. Por exemplo, uma solicitação GET para adicionar um item a um carrinho
http://myserver.com/addToCart?cart=314159&item=1729
não seria apropriado. As solicitações GET devem ser idempotentes . Ou seja, emitir uma solicitação duas vezes não deve ser diferente de emitir uma vez. É isso que torna os pedidos em cache. Uma solicitação "adicionar ao carrinho" não é idempotente - emitir duas vezes adiciona duas cópias do item ao carrinho. Uma solicitação POST é claramente apropriada nesse contexto. Assim, mesmo um aplicativo Web RESTful precisa de seu compartilhamento de solicitações POST.
Isso foi retirado do excelente livro Core JavaServer faces de David M. Geary.
REST é o princípio arquitetônico subjacente da web. O mais surpreendente da Web é o fato de que clientes (navegadores) e servidores podem interagir de maneiras complexas sem que o cliente saiba nada de antemão sobre o servidor e os recursos que ele hospeda. A principal restrição é que o servidor e o cliente devem concordar com a mídia usada, que no caso da Web é HTML .
Uma API que segue os princípios do REST não exige que o cliente saiba nada sobre a estrutura da API. Em vez disso, o servidor precisa fornecer todas as informações que o cliente precisa para interagir com o serviço. Um formulário HTML é um exemplo disso: O servidor especifica o local do recurso e os campos obrigatórios. O navegador não sabe com antecedência onde enviar as informações e não sabe com antecedência quais informações enviar. Ambas as formas de informação são totalmente fornecidas pelo servidor. (Esse princípio é chamado HATEOAS : Hipermídia como o mecanismo do estado do aplicativo .)
Então, como isso se aplica ao HTTP e como ele pode ser implementado na prática? O HTTP é orientado em torno de verbos e recursos. Os dois verbos em uso mainstream são GET
e POST
, que eu acho que todos reconhecerão. No entanto, o padrão HTTP define vários outros, como PUT
e DELETE
. Esses verbos são aplicados aos recursos, de acordo com as instruções fornecidas pelo servidor.
Por exemplo, vamos imaginar que temos um banco de dados do usuário gerenciado por um serviço da web. Nosso serviço usa uma hipermídia personalizada baseada em JSON, para a qual atribuímos o tipo mimético application/json+userdb
(também pode haver um application/xml+userdb
e application/whatever+userdb
- muitos tipos de mídia podem ser suportados). O cliente e o servidor foram programados para entender esse formato, mas não sabem nada um do outro. Como Roy Fielding aponta:
Uma API REST deve gastar quase todo o seu esforço descritivo na definição do (s) tipo (s) de mídia usado para representar recursos e direcionar o estado do aplicativo, ou na definição de nomes de relações estendidos e / ou marcação ativada por hipertexto para os tipos de mídia padrão existentes.
Uma solicitação para o recurso base /
pode retornar algo como isto:
Solicitação
GET /
Accept: application/json+userdb
Resposta
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Sabemos pela descrição de nossa mídia que podemos encontrar informações sobre recursos relacionados nas seções chamadas "links". Isso é chamado de controles Hypermedia . Nesse caso, podemos dizer a partir de uma seção como essa que podemos encontrar uma lista de usuários fazendo outra solicitação para /user
:
Solicitação
GET /user
Accept: application/json+userdb
Resposta
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Podemos dizer muito dessa resposta. Por exemplo, agora sabemos que podemos criar um novo usuário POST
ao /user
:
Solicitação
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
Resposta
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Também sabemos que podemos alterar os dados existentes:
Solicitação
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
Resposta
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Observe que estamos usando diferentes verbos HTTP ( GET
, PUT
, POST
, DELETE
etc.) para manipular esses recursos, e que o único conhecimento presumimos por parte do cliente é a nossa definição de mídia.
Leitura adicional:
(Essa resposta foi alvo de uma grande quantidade de críticas por ter falhado o argumento. Na maioria das vezes, essa foi uma crítica justa. O que eu descrevi originalmente estava mais de acordo com a maneira como o REST era geralmente implementado alguns anos atrás, quando eu primeiro escrevi isso, em vez de seu verdadeiro significado. Revi a resposta para representar melhor o significado real.)
A programação RESTful é sobre:
Create
, Retrieve
, Update
, Delete
torna-se POST
, GET
, PUT
, e DELETE
. Mas o REST não se limita ao HTTP, é apenas o transporte mais usado no momento.O último é provavelmente o mais importante em termos de consequências e eficácia geral do REST. No geral, a maioria das discussões RESTful parece centrar-se no HTTP e seu uso em um navegador e o que não. Entendo que R. Fielding cunhou o termo quando descreveu a arquitetura e as decisões que levam ao HTTP. Sua tese é mais sobre a arquitetura e a capacidade de cache dos recursos do que sobre o HTTP.
Se você está realmente interessado no que é uma arquitetura RESTful e por que ela funciona, leia sua tese algumas vezes e leia a coisa toda, não apenas o Capítulo 5! A seguir, veja por que o DNS funciona . Leia sobre a organização hierárquica do DNS e como as referências funcionam. Em seguida, leia e considere como o cache do DNS funciona. Por fim, leia as especificações HTTP ( RFC2616 e RFC3040 em particular) e considere como e por que o cache funciona da maneira que funciona. Eventualmente, apenas clique. A revelação final para mim foi quando vi a semelhança entre DNS e HTTP. Depois disso, entender por que as interfaces SOA e Message Passing Interfaces são escaláveis começa a clicar.
Eu acho que o truque mais importante para entender a importância da arquitetura e as implicações de desempenho de uma arquitetura RESTful e Shared Nothing é evitar ficar preso nos detalhes da tecnologia e da implementação. Concentre-se em quem possui os recursos, quem é responsável por criá-los / mantê-los, etc. Em seguida, pense nas representações, protocolos e tecnologias.
PUT
e POST
não mapeie realmente um a um com atualização e criação. PUT
pode ser usado para criar se o cliente está ditando qual será o URI. POST
cria se o servidor estiver atribuindo o novo URI.
urn:
esquema. Conceitualmente, não há diferença; no entanto, um URN exige que você tenha um método definido separadamente para "localizar" o recurso identificado (nomeado) pelo URN. Deve-se tomar cuidado para garantir que você não introduza acoplamentos implícitos ao relacionar recursos nomeados e sua localização.
É assim que pode parecer.
Crie um usuário com três propriedades:
POST /user
fname=John&lname=Doe&age=25
O servidor responde:
200 OK
Location: /user/123
No futuro, você poderá recuperar as informações do usuário:
GET /user/123
O servidor responde:
200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>
Para modificar o registro ( lname
e age
permanecerá inalterado):
PATCH /user/123
fname=Johnny
Para atualizar o registro (e consequentemente lname
e age
será NULL):
PUT /user/123
fname=Johnny
PUT fname=Jonny
. Isso iria definir lname
e age
aos valores (provavelmente NULL ou a string vazia, e inteiros 0) inadimplemento, porque um PUT
substitui todo o recurso com os dados da representação fornecido. Não é isso que está implícito em "atualização"; para fazer uma atualização real, use o PATCH
método, pois isso não altera os campos que não estão especificados na representação.
/user/1
não faz sentido e deve haver uma listagem em /users
. A resposta deve ser uma 201 Created
e não apenas OK nesse caso.
Um ótimo livro sobre o REST é o REST na prática .
As leituras obrigatórias são REST (Representational State Transfer) e as APIs REST devem ser orientadas por hipertexto
Consulte o artigo de Martin Fowlers, Richardson Maturity Model (RMM), para obter uma explicação sobre o que é um serviço RESTful.
Para ser RESTful, um Serviço precisa atender a Hipermídia como o Estado do Mecanismo de Aplicativo. (HATEOAS) , ou seja, ele precisa atingir o nível 3 no RMM, leia o artigo para obter detalhes ou os slides da conversa sobre o qcon .
A restrição HATEOAS é um acrônimo para Hypermedia como o mecanismo do estado do aplicativo. Esse princípio é o principal diferenciador entre um REST e a maioria das outras formas de sistema do servidor cliente.
...
Um cliente de um aplicativo RESTful precisa conhecer apenas uma única URL fixa para acessá-lo. Todas as ações futuras devem ser descobertas dinamicamente a partir de links hipermídia incluídos nas representações dos recursos retornados a partir dessa URL. Espera-se também que os tipos de mídia padronizados sejam entendidos por qualquer cliente que possa usar uma API RESTful. (Da Wikipédia, a enciclopédia livre)
O teste REST Litmus para estruturas da Web é um teste de maturidade semelhante para estruturas da web.
Aproximando-se do REST puro: aprender a amar o HATEOAS é uma boa coleção de links.
REST versus SOAP para a nuvem pública discute os níveis atuais de uso de REST.
REST e versionamento discutem Extensibilidade, Versionamento, Evolutibilidade, etc. através da Modificabilidade
O que é REST?
REST significa Representational State Transfer. (Às vezes, é escrito "ReST".) Ele conta com um protocolo de comunicações com cache, sem estado, cliente-servidor e estado - e em praticamente todos os casos, o protocolo HTTP é usado.
REST é um estilo de arquitetura para projetar aplicativos em rede. A idéia é que, em vez de usar mecanismos complexos como CORBA, RPC ou SOAP para conectar-se entre máquinas, HTTP simples seja usado para fazer chamadas entre máquinas.
De várias maneiras, a própria World Wide Web, baseada em HTTP, pode ser vista como uma arquitetura baseada em REST. Os aplicativos RESTful usam solicitações HTTP para postar dados (criar e / ou atualizar), ler dados (por exemplo, fazer consultas) e excluir dados. Portanto, o REST usa HTTP para todas as quatro operações CRUD (Criar / Ler / Atualizar / Excluir).
REST é uma alternativa leve a mecanismos como RPC (Remote Procedure Calls) e Web Services (SOAP, WSDL, et al.). Mais tarde, veremos quanto mais simples o REST é.
Apesar de simples, o REST é completo; basicamente não há nada que você possa fazer nos serviços da Web que não possa ser feito com uma arquitetura RESTful. REST não é um "padrão". Nunca haverá uma recomendação do W3C para o REST, por exemplo. E, embora existam estruturas de programação REST, trabalhar com o REST é tão simples que você pode "rolar sozinho" com recursos de biblioteca padrão em linguagens como Perl, Java ou C #.
Uma das melhores referências que encontrei quando tento encontrar o verdadeiro significado simples de descanso.
O REST está usando os vários métodos HTTP (principalmente GET / PUT / DELETE) para manipular dados.
Em vez de usar um URL específico para excluir um método (digamos /user/123/delete
), você envia uma solicitação DELETE para a /user/[id]
URL, edita um usuário, recupera informações sobre um usuário para o qual você envia uma solicitação GET./user/[id]
Por exemplo, em vez disso, um conjunto de URLs que podem se parecer com alguns dos seguintes.
GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1
Você usa os "verbos" HTTP e tem ..
GET /user/2
DELETE /user/2
PUT /user
É a programação em que a arquitetura do seu sistema se encaixa no estilo REST, apresentado por Roy Fielding em sua tese . Como esse é o estilo arquitetônico que descreve a web (mais ou menos), muitas pessoas estão interessadas nela.
Resposta bônus: Não. A menos que você esteja estudando arquitetura de software como um acadêmico ou projetando serviços da Web, não há realmente nenhuma razão para ouvir esse termo.
Eu diria que a programação RESTful seria sobre a criação de sistemas (API) que seguem o estilo de arquitetura REST.
Achei este tutorial fantástico, curto e fácil de entender sobre o REST do Dr. M. Elkstein e citando a parte essencial que responderia a sua pergunta em sua maior parte:
REST é um estilo de arquitetura para projetar aplicativos em rede. A idéia é que, em vez de usar mecanismos complexos como CORBA, RPC ou SOAP para conectar-se entre máquinas, HTTP simples seja usado para fazer chamadas entre máquinas.
- De várias maneiras, a própria World Wide Web, baseada em HTTP, pode ser vista como uma arquitetura baseada em REST.
Os aplicativos RESTful usam solicitações HTTP para postar dados (criar e / ou atualizar), ler dados (por exemplo, fazer consultas) e excluir dados. Portanto, o REST usa HTTP para todas as quatro operações CRUD (Criar / Ler / Atualizar / Excluir).
Eu não acho que você deva se sentir estúpido por não ouvir sobre o REST fora do Stack Overflow ..., eu estaria na mesma situação !; respostas para essa outra pergunta do SO sobre por que o REST está ficando grande agora podem aliviar alguns sentimentos.
Peço desculpas se não estou respondendo diretamente à pergunta, mas é mais fácil entender tudo isso com exemplos mais detalhados. Fielding não é fácil de entender devido a toda a abstração e terminologia.
Há um bom exemplo aqui:
Explicando o REST e o hipertexto: Spam-E, o robô de limpeza de spam
E melhor ainda, há uma explicação clara com exemplos simples aqui (o powerpoint é mais abrangente, mas você pode obter a maioria na versão html):
http://www.xfront.com/REST.ppt ou http://www.xfront.com/REST.html
Depois de ler os exemplos, pude ver por que Ken está dizendo que o REST é orientado por hipertexto. Na verdade, não tenho certeza de que ele esteja certo, porque esse / user / 123 é um URI que aponta para um recurso, e não está claro para mim que não é um descanso apenas porque o cliente sabe "fora de banda".
Esse documento do xfront explica a diferença entre REST e SOAP, e isso também é realmente útil. Quando Fielding diz: " Isso é RPC. Grita RPC. ", Fica claro que o RPC não é RESTful; portanto, é útil ver os motivos exatos para isso. (SOAP é um tipo de RPC.)
O que é REST?
REST em palavras oficiais, REST é um estilo de arquitetura construído em certos princípios, usando os fundamentos atuais da "Web". Existem 5 fundamentos básicos da web que são aproveitados para criar serviços REST.
Communication is Done by Representation
significa isso ?
Vejo várias respostas que dizem que colocar tudo sobre o usuário 123 no recurso "/ user / 123" é RESTful.
Roy Fielding, que cunhou o termo, diz que as APIs REST devem ser orientadas por hipertexto . Em particular, "Uma API REST não deve definir nomes ou hierarquias de recursos fixos".
Portanto, se o caminho "/ user / 123" estiver codificado no cliente, não será realmente RESTful. Um bom uso do HTTP, talvez, talvez não. Mas não é RESTful. Tem que vir do hipertexto.
A resposta é muito simples, há uma dissertação escrita por Roy Fielding.] 1 Nessa dissertação, ele define os princípios do REST. Se um aplicativo atender a todos esses princípios, esse será um aplicativo REST.
O termo RESTful foi criado porque ppl esgotou a palavra REST chamando seu aplicativo não REST como REST. Depois disso, o termo RESTful também se esgotou. Atualmente, estamos falando de APIs da Web e APIs Hypermedia , porque a maioria dos chamados aplicativos REST não preencheu a parte HATEOAS da restrição de interface uniforme.
As restrições REST são as seguintes:
arquitetura cliente-servidor
Portanto, ele não funciona com, por exemplo, soquetes PUB / SUB, é baseado em REQ / REP.
comunicação sem estado
Portanto, o servidor não mantém os estados dos clientes. Isso significa que você não pode usar o servidor de armazenamento em sessão lateral e precisa autenticar todas as solicitações. Seus clientes possivelmente enviam cabeçalhos de autenticação básicos por meio de uma conexão criptografada. (Em aplicativos grandes, é difícil manter muitas sessões.)
uso de cache, se puder
Portanto, você não precisa atender às mesmas solicitações repetidamente.
interface uniforme como contrato comum entre cliente e servidor
O contrato entre o cliente e o servidor não é mantido pelo servidor. Em outras palavras, o cliente deve ser dissociado da implementação do serviço. Você pode atingir esse estado usando soluções padrão, como o padrão IRI (URI) para identificar recursos, o padrão HTTP para trocar mensagens, tipos MIME padrão para descrever o formato de serialização do corpo, metadados (possivelmente vocabs RDF, microformatos etc.) para descreva a semântica de diferentes partes do corpo da mensagem. Para desacoplar a estrutura IRI do cliente, você deve enviar hiperlinks para os clientes em formatos hipermídia como (HTML, JSON-LD, HAL, etc.). Portanto, um cliente pode usar os metadados (possivelmente relações de link, vocabs RDF) atribuídos aos hiperlinks para navegar na máquina de estado do aplicativo através das transições de estado apropriadas, a fim de atingir seu objetivo atual.
Por exemplo, quando um cliente deseja enviar um pedido para uma loja virtual, é necessário verificar os hiperlinks nas respostas enviadas pela loja virtual. Ao verificar os links, ele encontra um descrito com o http://schema.org/OrderAction . O cliente conhece o vocabulário schema.org e entende que, ao ativar esse hiperlink, ele enviará o pedido. Por isso, ativa o hiperlink e envia uma POST https://example.com/api/v1/order
mensagem com o corpo apropriado. Depois disso, o serviço processa a mensagem e responde com o resultado com o cabeçalho de status HTTP adequado, por exemplo, 201 - created
com sucesso. Para anotar mensagens com metadados detalhados, a solução padrão para usar um formato RDF, por exemplo JSON-LD com um vocabulário REST, por exemplo Hydra e vocabs específicos de domínio comoVocabulário de ou qualquer outrodados vinculados ao schema.org e talvez um vocabulário específico de aplicativo personalizado, se necessário. Agora isso não é fácil, é por isso que a maioria das pessoas usa o HAL e outros formatos simples, que geralmente fornecem apenas um vocabulário REST, mas nenhum suporte a dados vinculados.
construir um sistema em camadas para aumentar a escalabilidade
O sistema REST é composto de camadas hierárquicas. Cada camada contém componentes que usam os serviços de componentes que estão na próxima camada abaixo. Assim, você pode adicionar novas camadas e componentes sem esforço.
Por exemplo, há uma camada de cliente que contém os clientes e, abaixo, uma camada de serviço que contém um único serviço. Agora você pode adicionar um cache do lado do cliente entre eles. Depois disso, você pode adicionar outra instância de serviço e um balanceador de carga, e assim por diante ... O código do cliente e o código de serviço não serão alterados.
código sob demanda para estender a funcionalidade do cliente
Essa restrição é opcional. Por exemplo, você pode enviar um analisador para um tipo de mídia específico para o cliente e assim por diante ... Para fazer isso, talvez seja necessário um sistema padrão de carregador de plugins no cliente ou seu cliente será acoplado à solução do carregador de plug-ins. .
As restrições REST resultam em um sistema altamente escalável, no qual os clientes são dissociados das implementações dos serviços. Assim, os clientes podem ser reutilizáveis, em geral, assim como os navegadores da Web. Os clientes e os serviços compartilham os mesmos padrões e vocabs, para que possam entender um ao outro, apesar do cliente não conhecer os detalhes de implementação do serviço. Isso possibilita a criação de clientes automatizados que podem encontrar e utilizar serviços REST para atingir seus objetivos. A longo prazo, esses clientes podem se comunicar e confiar nas tarefas, assim como os humanos. Se adicionarmos padrões de aprendizado a esses clientes, o resultado será uma ou mais IA usando a rede de máquinas em vez de um único parque de servidores. Então, no final, o sonho de Berners Lee: a rede semântica e a inteligência artificial serão realidade. Então, em 2030, terminamos pela Skynet. Até então ... ;-)
A programação da API RESTful (transferência de estado representacional) está gravando aplicativos da web em qualquer linguagem de programação, seguindo 5 princípios básicos de estilo de arquitetura de software :
Em outras palavras, você está escrevendo aplicativos simples de rede ponto a ponto sobre HTTP, que usam verbos como GET, POST, PUT ou DELETE implementando a arquitetura RESTful, que propõe padronização da interface que cada "recurso" expõe. Não é nada que usar os recursos atuais da web de maneira simples e eficaz (arquitetura bem-sucedida, comprovada e distribuída). É uma alternativa para mecanismos mais complexos, como SOAP , CORBA e RPC .
A programação RESTful está em conformidade com o design da arquitetura da Web e, se implementada adequadamente, permite tirar o máximo proveito da infraestrutura da Web escalável.
Se eu tivesse que reduzir a dissertação original no REST para apenas três frases curtas, acho que o seguinte captura sua essência:
Depois disso, é fácil entrar em debates sobre adaptações, convenções de codificação e práticas recomendadas.
Curiosamente, não há menção de operações HTTP POST, GET, DELETE ou PUT na dissertação. Essa deve ser a interpretação posterior de alguém de uma "melhor prática" para uma "interface uniforme".
Quando se trata de serviços da Web, parece que precisamos de alguma maneira de distinguir arquiteturas baseadas em WSDL e SOAP, que adicionam uma sobrecarga considerável e, sem dúvida, muita complexidade desnecessária à interface. Eles também exigem estruturas adicionais e ferramentas de desenvolvedor para serem implementadas. Não tenho certeza se REST é o melhor termo para distinguir entre interfaces de senso comum e interfaces excessivamente projetadas, como WSDL e SOAP. Mas precisamos de algo.
REST é um padrão de arquitetura e estilo de gravação de aplicativos distribuídos. Não é um estilo de programação no sentido estrito.
Dizer que você usa o estilo REST é semelhante a dizer que você construiu uma casa em um estilo específico: por exemplo, Tudor ou Vitoriano. Tanto o REST como um estilo de software quanto o Tudor ou o Victorian como um estilo doméstico podem ser definidos pelas qualidades e restrições que os compõem. Por exemplo, o REST deve ter uma separação do Servidor Cliente em que as mensagens são autoexplicativas. As casas no estilo Tudor têm frontões sobrepostos e telhados inclinados com frontões voltados para a frente. Você pode ler a dissertação de Roy para aprender mais sobre as restrições e qualidades que compõem o REST.
O REST, diferentemente dos estilos domésticos, teve dificuldades para ser aplicado de forma consistente e prática. Isso pode ter sido intencional. Deixando sua implementação real até o designer. Portanto, você é livre para fazer o que quiser, desde que atenda às restrições estabelecidas na dissertação que estiver criando sistemas REST.
Bônus:
A web inteira é baseada em REST (ou REST foi baseado na web). Portanto, como desenvolvedor da web, você deve estar ciente disso, embora não seja necessário escrever bons aplicativos da web.
Aqui está o meu esboço básico do REST. Tentei demonstrar o pensamento por trás de cada um dos componentes em uma arquitetura RESTful, para que o entendimento do conceito seja mais intuitivo. Espero que isso ajude a desmistificar o REST para algumas pessoas!
REST (Representational State Transfer) é uma arquitetura de design que descreve como os recursos em rede (ou seja, nós que compartilham informações) são projetados e endereçados. Em geral, uma arquitetura RESTful permite que o cliente (a máquina solicitante) e o servidor (a máquina respondente) possam solicitar a leitura, gravação e atualização de dados sem que o cliente precise saber como o servidor opera e o servidor pode passar de volta sem precisar saber nada sobre o cliente. Ok, legal ... mas como fazemos isso na prática?
O requisito mais óbvio é que precisa haver algum tipo de linguagem universal para que o servidor possa dizer ao cliente o que está tentando fazer com a solicitação e que o servidor responda.
Mas, para encontrar qualquer recurso específico e depois informar ao cliente onde ele mora, é necessário que haja uma maneira universal de apontar para os recursos. É aqui que entram os URIs (Universal Resource Identifiers); eles são basicamente endereços únicos para encontrar os recursos.
Mas a arquitetura REST não termina aí! Embora o acima exposto atenda às necessidades básicas do que queremos, também queremos ter uma arquitetura que ofereça suporte a tráfego de alto volume, pois qualquer servidor geralmente lida com respostas de vários clientes. Portanto, não queremos sobrecarregar o servidor, lembrando informações sobre solicitações anteriores.
Portanto, impomos a restrição de que cada par de solicitação-resposta entre o cliente e o servidor seja independente, o que significa que o servidor não precisa se lembrar de nada sobre solicitações anteriores (estados anteriores da interação cliente-servidor) para responder a uma nova solicitação. Isso significa que queremos que nossas interações sejam apátridas.
Para aliviar ainda mais a tensão no servidor de refazer cálculos que já foram feitos recentemente para um determinado cliente, o REST também permite o armazenamento em cache. Basicamente, o armazenamento em cache significa tirar uma captura instantânea da resposta inicial fornecida ao cliente. Se o cliente fizer a mesma solicitação novamente, o servidor poderá fornecer o instantâneo ao cliente, em vez de refazer todos os cálculos necessários para criar a resposta inicial. No entanto, como se trata de um instantâneo, se o instantâneo não tiver expirado - o servidor define um tempo de expiração com antecedência - e a resposta foi atualizada desde o cache inicial (ou seja, a solicitação forneceria uma resposta diferente da resposta em cache) , o cliente não verá as atualizações até que o cache expire (ou o cache seja limpo) e a resposta seja renderizada do zero novamente.
A última coisa que você encontrará aqui aqui sobre arquiteturas RESTful é que elas são colocadas em camadas. Na verdade, já discutimos implicitamente esse requisito em nossa discussão sobre a interação entre o cliente e o servidor. Basicamente, isso significa que cada camada em nosso sistema interage apenas com as camadas adjacentes. Portanto, em nossa discussão, a camada do cliente interage com a nossa camada de servidor (e vice-versa), mas pode haver outras camadas de servidor que ajudem o servidor primário a processar uma solicitação com a qual o cliente não se comunica diretamente. Em vez disso, o servidor passa a solicitação conforme necessário.
Agora, se tudo isso soa familiar, então ótimo. O HTTP (Hypertext Transfer Protocol), que define o protocolo de comunicação pela Internet é uma implementação da noção abstrata de arquitetura RESTful (ou uma instância da classe REST se você é um fanático por OOP como eu). Nesta implementação do REST, o cliente e o servidor interagem via GET, POST, PUT, DELETE etc., que fazem parte do idioma universal e os recursos podem ser apontados usando URLs.
Eu acho que o ponto de descanso é a separação do estado em uma camada superior, enquanto faz uso da Internet (protocolo) como uma camada de transporte sem estado . A maioria das outras abordagens confunde as coisas.
Essa tem sido a melhor abordagem prática para lidar com as mudanças fundamentais da programação na era da Internet. Com relação às mudanças fundamentais, Erik Meijer tem uma discussão em exibição aqui: http://www.infoq.com/interviews/erik-meijer-programming-language-design-effects-purity#view_93197 . Ele resume os cinco efeitos e apresenta uma solução projetando a solução em uma linguagem de programação. A solução também pode ser alcançada no nível da plataforma ou do sistema, independentemente do idioma. O repousante pode ser visto como uma das soluções que tem tido muito sucesso na prática atual.
Com estilo repousante, você obtém e manipula o estado do aplicativo em uma Internet não confiável. Se a operação atual falhar para obter o estado correto e atual, será necessário o princípio de validação zero para ajudar o aplicativo a continuar. Se ele não conseguir manipular o estado, normalmente usa vários estágios de confirmação para manter as coisas corretas. Nesse sentido, o resto não é uma solução completa, ele precisa das funções em outra parte da pilha de aplicativos da web para dar suporte ao seu trabalho.
Dado esse ponto de vista, o estilo restante não está realmente vinculado à Internet ou aplicativo da Web. É uma solução fundamental para muitas das situações de programação. Também não é simples, apenas torna a interface realmente simples e lida com outras tecnologias incrivelmente bem.
Apenas o meu 2c.
Edit: Dois aspectos mais importantes:
Apatridia é enganosa. É sobre a API tranquila, não o aplicativo ou sistema. O sistema precisa ser estável. O design tranqüilo é sobre como projetar um sistema com estado baseado em uma API sem estado. Algumas citações de outro controle de qualidade :
Esta é uma "discussão" incrivelmente longa e, no entanto, bastante confusa.
OMI:
1) Não existe programação repousante, sem uma grande junta e muita cerveja :)
2) Representational State Transfer (REST) é um estilo arquitetônico especificado na dissertação de Roy Fielding . Tem uma série de restrições. Se o seu Serviço / Cliente os respeitar, será RESTful. É isso.
Você pode resumir (significativamente) as restrições para:
Há outro post muito bom que explica bem as coisas.
Muitas respostas copiam / colam informações válidas, misturando-as e adicionando alguma confusão. As pessoas falam aqui sobre níveis, sobre URIs RESTFul (não existe isso!), Aplicam métodos HTTP GET, POST, PUT ... REST não é sobre isso ou não apenas sobre isso.
Por exemplo, links - é bom ter uma API com uma aparência bonita, mas no final o cliente / servidor não se importa realmente com os links que você recebe / envia, é o conteúdo que importa.
No final, qualquer cliente RESTful deve poder consumir qualquer serviço RESTful, desde que o formato do conteúdo seja conhecido.
Pergunta antiga, maneira nova de responder. Há muitos conceitos errados por aí sobre esse conceito. Eu sempre tento lembrar:
Eu defino programação repousante como
Um aplicativo é tranqüilo se fornece recursos (sendo a combinação de controles de transições de dados + estado) em um tipo de mídia que o cliente entende
Para ser um programador tranqüilo, você deve tentar criar aplicativos que permitam que os atores façam coisas. Não apenas expondo o banco de dados.
Os controles de transição de estado só fazem sentido se o cliente e o servidor concordarem com uma representação do tipo de mídia do recurso. Caso contrário, não há como saber o que é um controle e o que não é e como executar um controle. IE, se os navegadores não souberem <form>
tags em html, não haverá nada para você enviar para o estado de transição no navegador.
Não estou procurando me autopromover, mas expandi essas idéias com grande profundidade em minha palestra http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .
Um trecho da minha palestra é sobre o modelo de maturidade richardson, muitas vezes referido, não acredito nos níveis, você é RESTful (nível 3) ou não, mas o que eu gosto de destacar é o que cada nível faz por você no seu caminho para o RESTful
O REST define 6 restrições de arquitetura que tornam qualquer serviço da Web - uma verdadeira API RESTful .
REST === A analogia HTTP não está correta até que você não enfatize o fato de que "DEVE" ser acionado pelo HATEOAS .
O próprio Roy limpou aqui .
Uma API REST deve ser inserida sem conhecimento prévio além do URI inicial (marcador) e conjunto de tipos de mídia padronizados que são apropriados para o público-alvo (ou seja, espera-se que seja entendido por qualquer cliente que possa usar a API). A partir desse ponto, todas as transições de estado do aplicativo devem ser conduzidas pela seleção do cliente de opções fornecidas pelo servidor que estão presentes nas representações recebidas ou implícitas pela manipulação do usuário dessas representações. As transições podem ser determinadas (ou limitadas por) o conhecimento do cliente sobre os tipos de mídia e os mecanismos de comunicação de recursos, os quais podem ser aprimorados imediatamente (por exemplo, código sob demanda).
[Falha aqui implica que informações fora de banda estão gerando interação em vez de hipertexto.]
REST é um estilo arquitetural baseado em padrões da web e no protocolo HTTP (introduzido em 2000).
Em uma arquitetura baseada em REST, tudo é um recurso (Usuários, Pedidos, Comentários). Um recurso é acessado através de uma interface comum, com base nos métodos padrão HTTP (GET, PUT, PATCH, DELETE etc).
Em uma arquitetura baseada em REST, você possui um servidor REST que fornece acesso aos recursos. Um cliente REST pode acessar e modificar os recursos REST.
Todo recurso deve suportar as operações comuns do HTTP. Os recursos são identificados por IDs globais (que normalmente são URIs).
O REST permite que os recursos tenham representações diferentes, por exemplo, texto, XML, JSON etc. O cliente REST pode solicitar uma representação específica por meio do protocolo HTTP (negociação de conteúdo).
Métodos HTTP:
Os métodos PUT, GET, POST e DELETE são normalmente usados em arquiteturas baseadas em REST. A tabela a seguir fornece uma explicação dessas operações.
REST significa transferência de estado representacional .
Ele se baseia em um protocolo de comunicações armazenável em cache, sem estado e servidor-estado - e em praticamente todos os casos, o protocolo HTTP é usado.
O REST é frequentemente usado em aplicativos móveis, sites de redes sociais, ferramentas de mashup e processos de negócios automatizados. O estilo REST enfatiza que as interações entre clientes e serviços são aprimoradas por ter um número limitado de operações (verbos). A flexibilidade é fornecida pela atribuição de recursos (substantivos) aos seus próprios URIs (Indicadores Universal de Recursos).
Falar é mais do que simplesmente trocar informações . Um protocolo é realmente projetado para que nenhuma conversa tenha que ocorrer. Cada parte sabe qual é o seu trabalho específico, porque é especificado no protocolo. Os protocolos permitem a troca pura de informações em detrimento de alterações nas ações possíveis. Falar, por outro lado, permite que uma parte pergunte que outras ações podem ser tomadas pela outra parte. Eles podem até fazer a mesma pergunta duas vezes e obter duas respostas diferentes, pois o Estado da outra parte pode ter mudado nesse meio tempo. Falar é arquitetura RESTful . A tese de Fielding especifica a arquitetura que seria necessário seguir se quisesse permitir que as máquinas conversassem entre si em vez de simplesmentecomunicar .
Não existe noção de "programação RESTful" por si só. Seria melhor chamado de paradigma RESTful ou ainda melhor arquitetura RESTful. Não é uma linguagem de programação. É um paradigma.
Na computação, a transferência de estado representacional (REST) é um estilo de arquitetura usado para o desenvolvimento da web.
O ponto importante é que, se concordarmos em usar uma linguagem comum para operações básicas (os verbos http), a infraestrutura poderá ser configurada para entendê-los e otimizá-los adequadamente, por exemplo, usando cabeçalhos de cache para implementar o cache. níveis.
Com uma operação GET tranquila implementada corretamente, não importa se as informações vêm do banco de dados do servidor, do memcache do servidor, de uma CDN, do cache de um proxy, do cache do navegador ou do armazenamento local do navegador. A fonte atualizada em jejum e mais prontamente disponível pode ser usada.
Dizer que Rest é apenas uma mudança sintática do uso de solicitações GET com um parâmetro de ação para o uso dos verbos http disponíveis faz com que pareça que não tem benefícios e é puramente cosmético. O objetivo é usar uma linguagem que possa ser entendida e otimizada por todas as partes da cadeia. Se a sua operação GET tiver uma ação com efeitos colaterais, você precisará pular todo o cache HTTP ou obter resultados inconsistentes.
O que é teste de API ?
O teste da API utiliza programação para enviar chamadas para a API e obter o rendimento. O teste considera o segmento em teste como uma caixa preta. O objetivo do teste da API é confirmar a execução correta e o erro da parte que precede sua coordenação em um aplicativo.
API REST
REST: Transferência de Estado Representacional.
4 métodos de API comumente usados: -
Etapas para testar a API manualmente: -
Para usar a API manualmente, podemos usar plug-ins de API REST baseados em navegador.
Isso é muito menos mencionado em todos os lugares, mas o Modelo de Maturidade de Richardson é um dos melhores métodos para realmente julgar como Restful é a API. Mais sobre isso aqui:
Eu diria que um componente importante no entendimento do REST está nos pontos finais ou mapeamentos, como /customers/{id}/balance
.
Você pode imaginar um ponto de extremidade como o pipeline de conexão do site (front-end) ao seu banco de dados / servidor (back-end). Utilizando-os, o front-end pode executar operações de back-end definidas nos métodos correspondentes de qualquer mapeamento REST no seu aplicativo.