<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Monica Vasconcelos</title>
    <description>The latest articles on DEV Community by Monica Vasconcelos (@monicavasco).</description>
    <link>https://dev.to/monicavasco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F348672%2F1ad5ae49-8534-47d2-9fd0-d7954ee92bb7.png</url>
      <title>DEV Community: Monica Vasconcelos</title>
      <link>https://dev.to/monicavasco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/monicavasco"/>
    <language>en</language>
    <item>
      <title>Desmistificando API Rest</title>
      <dc:creator>Monica Vasconcelos</dc:creator>
      <pubDate>Tue, 10 Mar 2020 14:25:28 +0000</pubDate>
      <link>https://dev.to/monicavasco/desmistificando-api-rest-4e61</link>
      <guid>https://dev.to/monicavasco/desmistificando-api-rest-4e61</guid>
      <description>&lt;p&gt;API é uma interface que expomos ao mundo. Tem o principal objetivo de disponibilizar recursos de uma aplicação para ser consumida por outra aplicação. É construída por um elemento de especificação que descreve como a informação é trocada.&lt;br&gt;
Desta forma, entendemos que as APIs permitem uma interoperabilidade entre aplicações, ou seja, a comunicação entre aplicações e entre os usuários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
REST é um acrônimo de Representational State Transfer, e tem como objetivo primário a definição de características fundamentais para a construção de aplicações Web seguindo boas práticas.&lt;br&gt;
Não é um padrão e sim uma arquitetura. Os formatos suportados são JSON e XML e utiliza apenas o protocolo HTTP/HTTPS. As requisições são feitas com GET, POST e até outros métodos menos conhecidos do protocolo HTTP, como PUT e DELETE. Porém, o HTML só implementa dois verbos: GET e POST. Para que consigamos utilizar os demais, podemos enviar na query string  do action do formulário o método que queremos utilizar. O servidor que receber a requisição deverá entender isso.&lt;/p&gt;

&lt;p&gt;form action=”/planets?_method=DELETE” method=”POST”&lt;/p&gt;

&lt;p&gt;Toda aplicação que gerencia informações é chamada de recurso no modelo REST. Um recurso é uma abstração de um determinado tipo de informação que uma aplicação gerencia e deve possuir uma identificação única. Essa identificação é utilizada para diferenciar qual recurso será manipulado em uma determinada solicitação. A identificação do recurso deve ser feita utilizando-se o conceito de URI (Uniform Resource Identifier).&lt;/p&gt;

&lt;p&gt;API Restful é, portanto, uma API (Application programming interface) que utiliza requisições HTTP para coletar, inserir, postar e deletar dados, tendo como base a arquitetura REST muito utilizada no desenvolvimento de serviços web, baseada nos conceitos do protocolo HTTP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CARACTERÍSTICAS DO REST&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Cada requisição ao serviço deve retornar o conteúdo sem manter estado, ou seja, uma requisição é independente da outra.&lt;br&gt;
• Tem um conjunto de operações padronizadas&lt;br&gt;
• Utiliza uma URI (Uniform Resource Identifier), ou, uma sintaxe universal para identificar recursos.&lt;br&gt;
• Utilização de tipos de conteúdo (mime-type) para solicitar e retornar conteúdo, com isso é possível que o cliente especifique se deseja que o conteúdo seja retornado em XML ou JSON, por exemplo.&lt;/p&gt;

&lt;p&gt;Vejamos abaixo como funciona a estrutura da requisição e resposta:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura da requisição&lt;/strong&gt;&lt;br&gt;
Uma requisição é um pedido que fazemos a um webservice. O protocolo HTTP é baseado em pedidos e respostas. Quando um navegador acessa um site, ele envia uma requisição ao servidor, pedindo o conteúdo. Esse conteúdo que vem em forma de HTML é  a resposta do servidor.&lt;/p&gt;

&lt;p&gt;Veja a estrutura:&lt;br&gt;
&lt;strong&gt;Endpoint&lt;/strong&gt; – É o endereço web.&lt;br&gt;
&lt;strong&gt;Query&lt;/strong&gt; – É a query string na URI. Ex. /livros?lingua=pt-br&lt;br&gt;
&lt;strong&gt;Recurso&lt;/strong&gt; – É um caminho. Ex. &lt;a href="http://site.com.br/carros" rel="noopener noreferrer"&gt;http://site.com.br/carros&lt;/a&gt; (a palavra carros é o recurso).&lt;br&gt;
&lt;strong&gt;Parâmetros&lt;/strong&gt; – São variáveis enviadas na URI. Ex. &lt;a href="http://site.com.br/carros/1" rel="noopener noreferrer"&gt;http://site.com.br/carros/1&lt;/a&gt; (o número 1 é o parâmetro).&lt;br&gt;
&lt;strong&gt;Cabeçalho&lt;/strong&gt; – São dados adicionais enviados na requisição. Ex. tipo de mídia que aceitamos como retorno, token para autenticação etc.&lt;br&gt;
&lt;strong&gt;Método&lt;/strong&gt; – É o tipo de requisição, chamado também de verbo. Ex. OPTIONS, GET, HEAD, POST, PUT, DELETE.&lt;br&gt;
&lt;strong&gt;Dado&lt;/strong&gt; – É o corpo da requisição. Ex. quando enviamos um formulário via POST, os dados nos inputs são o corpo da requisição.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura da resposta&lt;/strong&gt;&lt;br&gt;
A resposta é o retorno, que é o resultado de uma requisição. &lt;/p&gt;

&lt;p&gt;Veja a estrutura:&lt;br&gt;
&lt;strong&gt;Status Code&lt;/strong&gt; – É uma representação numérica de resposta. Veremos detalhes mais a frente.&lt;br&gt;
&lt;strong&gt;Dado&lt;/strong&gt; – É o corpo do retorno. O resultado da requisição.&lt;br&gt;
&lt;strong&gt;Cabeçalho&lt;/strong&gt; – São informações extras enviadas pelo servidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRINCÍPIOS PARA DESENHAR APIs RESTFUL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Veremos agora como entender os principais princípios que devemos seguir para desenhar APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Mantenha simples&lt;/strong&gt;&lt;br&gt;
A base da URL deve ser simples e intuitiva. Por exemplo, se queremos desenhar APIs para projetos, poderemos fazer algo parecido como:&lt;/p&gt;

&lt;p&gt;/projetos – lista todos os projetos&lt;br&gt;
/projetos/123 – lista um projeto específico&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use nomes, não verbos&lt;/strong&gt;&lt;br&gt;
Um dos grandes erros ao criar APIs está relacionado aos endpoints. O padrão Restful exige que sejam utilizados nomes e não verbos. Por exemplo, para exibir todos os projetos, devemos usar:&lt;/p&gt;

&lt;p&gt;/projetos e não /obterProjetos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use o método HTTP certo&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;GET&lt;/strong&gt; – Obter um recurso ou uma coleção de recursos. Método mais comum de requisição. Deve ser utilizado para serviços de consultas. Possui limite de caracteres, 2045, que varia conforme o browser, por isso é boa prática passar poucos caracteres na URL. Sempre que um endereço de uma página é digitado no browser, uma requisição GET é feita.&lt;br&gt;
&lt;strong&gt;POST&lt;/strong&gt; -  Criar um recurso ou uma coleção de recursos. É utilizado para enviar dados ao servidor, por exemplo: cadastro de usuários, cadastro de login, upload de fotos, etc&lt;br&gt;
&lt;strong&gt;PUT/PATCH&lt;/strong&gt; – Atualizar um recurso existente ou uma coleção de recursos. Sua requisição é parecida com POST.&lt;br&gt;
&lt;strong&gt;DELETE&lt;/strong&gt; – Deletar um recurso existente ou uma coleção de recursos. Sua requisição é parecida com GET.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use Plural&lt;/strong&gt;&lt;br&gt;
É importante manter no plural, para evitar confusão sobre se estamos falando de obter um único recurso ou uma coleção de recursos. Também evitar adicionar informações adicionais na URL, como:&lt;/p&gt;

&lt;p&gt;/projeto/all&lt;/p&gt;

&lt;p&gt;O melhor seria:&lt;/p&gt;

&lt;p&gt;/projetos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use Parâmetros&lt;/strong&gt;&lt;br&gt;
Às vezes precisamos de uma API que passe mais informações do que apenas uma identificação. Nesses casos, devemos usar parâmetros de consulta, por exemplo:&lt;/p&gt;

&lt;p&gt;/projects?name=”TESTE” em vez de /getProjectsByName&lt;br&gt;
/projcts?type=”xyz” em ez de /getProjectsByType&lt;/p&gt;

&lt;p&gt;Dessa forma você evita URLs longas com simplicidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use os códigos HTTP corretos&lt;/strong&gt;&lt;br&gt;
Sempre que uma requisição HTTP é feita, um código numérico é retornado, indicando o resultado da requisição.&lt;br&gt;
Esses códigos são divididos em cinco famílias:&lt;br&gt;
1xx – Informacionais&lt;br&gt;
2xx – Códigos de sucesso&lt;br&gt;
3xx – Códigos de redirecionamento&lt;br&gt;
4xx – Erros causados pelo cliente&lt;br&gt;
5xx – Erros originados no servidor&lt;/p&gt;

&lt;p&gt;Existem diversos tipos de código HTTP, mas vou tratar aqui apenas dos mais comumente utilizados:&lt;/p&gt;

&lt;p&gt;200 OK – Usado para mostrar que a requisição foi bem sucedida.&lt;br&gt;
201 CREATED – Usado quando se usa o método POST para criar novo recurso e indica que o recurso foi salvo com sucesso.&lt;br&gt;
202 ACCEPTED  - Usado para confirmar a solicitação enviada ao servidor e que será processada em outro momento. Usado tipicamente em requisições assíncronas, que não serão processadas em tempo real.&lt;br&gt;
204   NO CONTENT – Requisição efetuada com sucesso, porém não existe nenhum retorno.&lt;br&gt;
301 – MOVED PERMANENTLY – Requisição com sucesso, mas fez um redirecionamento para outra página.&lt;br&gt;
400 BAD REQUEST – Usado quando da validação de entrada do lado do cliente falha. Requisição inválida.&lt;br&gt;
401 UNAUTHORIZED -  Indica falha na autenticação do serviço ou que se a autenticação ainda não feita.&lt;br&gt;
403 FORBIDDEN – Indica que o acesso a essa página foi negado por questões de segurança.&lt;br&gt;
404 NOT FOUND – Usado quando se está procurando um determinado recurso e ele não está disponível no sistema.&lt;br&gt;
405 – METHOD NOT ALLOWED – Caso o método HTTP solicitado não puder ser encontrado na página. Por exemplo, se o cliente tiver solicitado uma requisição do tipo DELET, mas o web service não a suportar.&lt;br&gt;
500 – INTERNAL SERVER ERROR  – Não usado explicitamente, mas pode ocorrer quando o sistema falhar.&lt;br&gt;
502 BAD GATEWAY – Usado se o servidor, enquanto atuando como um servidor intermediário (gateway ou proxy), recebeu uma resposta inválida do servidor para o qual a requisição foi encaminhada..&lt;br&gt;
504 – GATEWAY TIMEOUT – Erro de timeout caso a requisição não retorne no tempo estipulado.&lt;/p&gt;

&lt;p&gt;Essa é uma lista resumida. Para a lista completa, recomendo a leitura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.orgwiki/List_of_HTTP_status_codes" rel="noopener noreferrer"&gt;https://en.wikipedia.orgwiki/List_of_HTTP_status_codes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.w3.org/Protocols/HTTP/HTRESP.html" rel="noopener noreferrer"&gt;https://www.w3.org/Protocols/HTTP/HTRESP.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Versionamento&lt;/strong&gt;&lt;br&gt;
Versionamento de APIs é muito importante. Usado de diferentes maneiras: alguns desenvolvedores usam como data, enquanto outros usam versões como parâmetros de consulta.&lt;/p&gt;

&lt;p&gt;/v1/projects&lt;br&gt;
/v2/projects&lt;/p&gt;

&lt;p&gt;É importante evitar algo do tipo:&lt;/p&gt;

&lt;p&gt;/v1.2/projects&lt;/p&gt;

&lt;p&gt;Pois isso implica que a API muda frequentemente. Mantenha as coisas simples. É sempre boa prática manter a compatibilidade com as versões anteriores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use paginação&lt;/strong&gt;&lt;br&gt;
O uso de paginação é obrigatório quando você expõe uma API que pode retornar grande volume de dados. Se não for feito corretamente o consumidor por desativar o serviço.&lt;br&gt;
O uso de limite e deslocamento é recomendado aqui. Por exemplo:&lt;/p&gt;

&lt;p&gt;/projects?limit=25&amp;amp;offset=50&lt;/p&gt;

&lt;p&gt;Também é recomendável manter um limite e deslocamento padrão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Formatos suportados&lt;/strong&gt;&lt;br&gt;
É muito importante escolher como sua API responde. As aplicações modernas utilizam JSON, a menos que você tenha uma aplicação que precise obter uma resposta XML.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Use mensagens de erro adequadas&lt;/strong&gt;&lt;br&gt;
É sempre uma boa prática manter um conjunto de mensagens de erro que a aplicação envia e responde com a identificação adequada.&lt;/p&gt;

&lt;p&gt;Se você chegou até aqui, aprendeu os principais conceitos e as principais características de uma API Rest, no entanto deve ter notado que o tema é complexo e não é minha intenção esgotá-lo em um único artigo. Nos próximos artigos você verá como implementar uma API simples utilizando NodeJs.&lt;/p&gt;

&lt;p&gt;Se gostou do artigo, curta e compartilhe.&lt;/p&gt;

&lt;p&gt;Sugestões de melhoria são muito bem vindas.&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blog: &lt;a href="http://bluedev.com.br/2017/10/23/conceito-de-apis/" rel="noopener noreferrer"&gt;http://bluedev.com.br/2017/10/23/conceito-de-apis/&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://blog.caelum.com.br/rest-principios-e-boas-praticas/" rel="noopener noreferrer"&gt;https://blog.caelum.com.br/rest-principios-e-boas-praticas/&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/better-programming/restful-api-design-step-by-step-guide-2f2c9f9fcdbf" rel="noopener noreferrer"&gt;https://medium.com/better-programming/restful-api-design-step-by-step-guide-2f2c9f9fcdbf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendação de leitura:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Livro: &lt;a href="https://amzn.to/3onayIz" rel="noopener noreferrer"&gt;Construindo Aplicações com NodeJS&lt;/a&gt;&lt;a href="//ir-br.amazon-adsystem.com/e/ir?t=blogmonica-20&amp;amp;l=am2&amp;amp;o=33&amp;amp;a=8575226851" class="article-body-image-wrapper"&gt;&lt;img src="//ir-br.amazon-adsystem.com/e/ir?t=blogmonica-20&amp;amp;l=am2&amp;amp;o=33&amp;amp;a=8575226851" alt=""&gt;&lt;/a&gt;&lt;br&gt;
Livro: &lt;a href="http://amzn.to/2NCKVqx" rel="noopener noreferrer"&gt;Node Essencial&lt;/a&gt;&lt;a href="//ir-br.amazon-adsystem.com/e/ir?t=blogmonica-20&amp;amp;l=am2&amp;amp;o=33&amp;amp;a=8575226770" class="article-body-image-wrapper"&gt;&lt;img src="//ir-br.amazon-adsystem.com/e/ir?t=blogmonica-20&amp;amp;l=am2&amp;amp;o=33&amp;amp;a=8575226770" alt=""&gt;&lt;/a&gt;&lt;br&gt;
Livro: &lt;a href="https://amzn.to/3a5Bmbk" rel="noopener noreferrer"&gt;Programação web com Node e Express&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postado originalmente em: &lt;a href="https://monicavasconcelos.net" rel="noopener noreferrer"&gt;Blog Pessoal&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>node</category>
      <category>iniciantes</category>
    </item>
  </channel>
</rss>
