<?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: Marcello Gonçalves</title>
    <description>The latest articles on DEV Community by Marcello Gonçalves (@marcellorg).</description>
    <link>https://dev.to/marcellorg</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%2F1032484%2F8175520b-1b27-40db-8875-fcf3d0974727.jpeg</url>
      <title>DEV Community: Marcello Gonçalves</title>
      <link>https://dev.to/marcellorg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcellorg"/>
    <language>en</language>
    <item>
      <title>RESTful: Boas práticas para design de API</title>
      <dc:creator>Marcello Gonçalves</dc:creator>
      <pubDate>Fri, 17 Mar 2023 00:18:08 +0000</pubDate>
      <link>https://dev.to/marcellorg/restful-boas-praticas-para-design-de-api-4j4p</link>
      <guid>https://dev.to/marcellorg/restful-boas-praticas-para-design-de-api-4j4p</guid>
      <description>&lt;p&gt;Representational State Transfer (REST) é um estilo de arquitetura de software para sistemas distribuídos, amplamente utilizado na construção de APIs para a Web.&lt;/p&gt;

&lt;p&gt;RESTful é um termo usado para descrever APIs da Web que aderem a esses princípios de design REST. Uma API da Web RESTful é baseada em recursos, que podem ser identificados por meio de URIs exclusivos. As ações que podem ser realizadas em um recurso são expressas por meio de métodos HTTP, como GET, POST, PUT e DELETE.&lt;/p&gt;

&lt;p&gt;Esses princípios de design ajudam a tornar as APIs da Web mais simples, escaláveis, flexíveis e fáceis de entender e usar, permitindo a criação de sistemas mais robustos e interoperáveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que o design de API é tão importante?
&lt;/h2&gt;

&lt;p&gt;As pessoas fazem essa pergunta com bastante frequência e, para respondê-la:&lt;/p&gt;

&lt;p&gt;As APIs REST são a face de qualquer serviço e, portanto, devem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ser fáceis de entender, para que a integração seja simples&lt;/li&gt;
&lt;li&gt;Ser bem documentadas, para que os comportamentos semânticos sejam entendidos (não apenas sintáticos)&lt;/li&gt;
&lt;li&gt;Seguir padrões aceitos, como o HTTP&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Projetando e desenvolvendo APIs REST altamente úteis
&lt;/h2&gt;

&lt;p&gt;Existem várias convenções que seguimos na Hashmap ao projetar nossas APIs REST, para garantir que atendamos às expectativas listadas acima para o desenvolvimento de aceleradores e nossos projetos de consultoria.&lt;/p&gt;

&lt;p&gt;Essas convenções são as seguintes:&lt;/p&gt;

&lt;h2&gt;
  
  
  Use substantivos na URI
&lt;/h2&gt;

&lt;p&gt;As APIs REST devem ser projetadas para Recursos, que podem ser entidades ou serviços, etc., portanto, eles devem sempre ser substantivos. Por exemplo, em vez de &lt;code&gt;/createUsers&lt;/code&gt;, use &lt;code&gt;/users&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É importante considerar que os métodos HTTP precisam identificar suas rotas e ações de forma clara e entendível, vejamos os exemplos a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users
POST /users
PUT /users/{id}
GET /users/{id}
DELETE /users/{id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não use verbos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/getAllUsers
/createNewUsers 
/deleteAllRedUsers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Plural ou Singular
&lt;/h2&gt;

&lt;p&gt;Geralmente, preferimos usar plurais, mas não há uma regra rígida que impeça o uso do singular para o nome do recurso. A ideologia por trás do uso de plurais é:&lt;/p&gt;

&lt;p&gt;Estamos operando em um recurso de uma coleção de recursos, então, para representar a coleção, usamos o plural.&lt;/p&gt;

&lt;p&gt;Por exemplo, no caso de...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o cliente está solicitando recuperar um recurso da coleção de um usuário com o id 123. Ao criar um recurso, queremos adicionar um recurso à coleção atual de recursos, então a API ficaria assim...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Não misture substantivos singulares e plurais. Mantenha a simplicidade e use apenas substantivos no plural para todos os recursos.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Deixe o verbo HTTP definir a ação
&lt;/h2&gt;

&lt;p&gt;De acordo com o ponto #1 acima, as APIs devem fornecer apenas substantivos para recursos e deixar os verbos HTTP (GET, POST, PUT, DELETE) definirem a ação a ser realizada em um recurso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POST:&lt;/strong&gt;  É utilizado para criar um novo registro no banco de dados.&lt;br&gt;
&lt;strong&gt;GET:&lt;/strong&gt; É utilizado para ler registros no banco de dados.&lt;br&gt;
&lt;strong&gt;PUT:&lt;/strong&gt; É utilizado para atualizar um registro no banco de dados.&lt;br&gt;
&lt;strong&gt;PATCH:&lt;/strong&gt; É utilizado para atualizar parte de um registro no banco de dados.&lt;br&gt;
&lt;strong&gt;DELETE:&lt;/strong&gt; É utilizado para deletar um registro no banco de dados.&lt;/p&gt;


&lt;h2&gt;
  
  
  Não use os métodos seguros de forma inadequada (idempotência)
&lt;/h2&gt;

&lt;p&gt;Os métodos seguros são métodos HTTP que retornam a mesma representação de recursos independentemente do número de vezes que são chamados pelo cliente. GET, HEAD, OPTIONS e TRACE são definidos como seguros, o que significa que são apenas destinados a recuperar dados e não devem alterar o estado de um recurso em um servidor. Não use GET para excluir conteúdo, por exemplo...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123/delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não é que isso não possa ser implementado, mas a especificação HTTP é violada neste caso.&lt;/p&gt;

&lt;p&gt;Use os métodos HTTP de acordo com a ação que precisa ser executada.&lt;/p&gt;




&lt;h2&gt;
  
  
  Represente hierarquia de recursos através da URI
&lt;/h2&gt;

&lt;p&gt;Se um recurso contiver sub-recursos, certifique-se de representá-lo na API para torná-lo mais explícito. Por exemplo, se um usuário possui itens e desejamos recuperar uma item específica por usuário, a API pode ser definida como GET &lt;code&gt;/users/123/posts/1&lt;/code&gt;, o que recuperará o item com o ID 1 do usuário com o ID 123.&lt;/p&gt;




&lt;h2&gt;
  
  
  Versione suas APIs
&lt;/h2&gt;

&lt;p&gt;Versionar APIs sempre ajuda a garantir a compatibilidade retroativa de um serviço ao adicionar novos recursos ou atualizar funcionalidades existentes para novos clientes. Existem diferentes escolas de pensamento sobre como versionar sua API, mas a maioria delas se enquadra nas duas categorias abaixo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existem 2 maneiras de especificar a versão nos headers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Header personalizado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adicionar uma chave de header personalizado X-API-VERSION (ou qualquer outro header de escolha) pelo cliente pode ser usada por um serviço para rotear uma solicitação para o endpoint correto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accept Header:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usando o header Accept para especificar sua versão, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accept: application/vnd.service.v2+json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Incorpore a versão na URL, como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /v1/users
POST /v2/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embora ambos os métodos possam ser utilizados para versionar APIs, o método de URL oferece melhor descoberta de recursos ao olhar para a URL. É importante lembrar que a escolha do método de versionamento é uma decisão do desenvolvedor e ambas as abordagens têm suas vantagens e desvantagens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Retornar representação
&lt;/h2&gt;

&lt;p&gt;Os métodos POST, PUT ou PATCH, usados para criar um recurso ou atualizar campos em um recurso, devem sempre retornar uma representação atualizada do recurso como resposta, juntamente com um código de status apropriado, conforme descrito nos pontos a seguir.&lt;/p&gt;

&lt;p&gt;Se o POST for bem-sucedido ao adicionar um novo recurso, ele deve retornar o código de status HTTP 201, juntamente com a URI do novo recurso criado no cabeçalho Location (conforme especificado na especificação HTTP). Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/users&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Novo usuário"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"novo_usuario@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cidade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rio de Janeiro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Created&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Location:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/users/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Novo usuário"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"novo_usuario@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cidade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rio de Janeiro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o PUT ou PATCH for bem-sucedido ao atualizar um recurso existente, ele deve retornar o código de status HTTP 200 ou 204, juntamente com a representação atualizada do recurso. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;PUT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/users/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Novo usuário update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"novo_usuario@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cidade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rio de Janeiro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OK&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Novo usuário update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"idade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"novo_usuario@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cidade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rio de Janeiro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;PATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/users/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Novo usuário patch"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Response:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;No&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Content&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certifique-se de documentar claramente como suas respostas de API serão formatadas e quais códigos de status você usará em diferentes situações. Isso ajudará os clientes da sua API a entender como interagir com ela e a lidar com possíveis erros de forma eficaz.&lt;/p&gt;




&lt;h2&gt;
  
  
  Filtro, busca e ordenação
&lt;/h2&gt;

&lt;p&gt;Não crie URIs diferentes para buscar recursos com parâmetros de filtro, busca ou ordenação. Tente manter a URI simples e adicione parâmetros de consulta para representar parâmetros ou critérios para buscar um recurso (um único tipo de recurso).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtragem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use parâmetros de consulta definidos na URL para filtrar um recurso do servidor. Por exemplo, se quisermos buscar todos os posts publicados por um usuário, podemos projetar uma API como esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123/posts?state=published
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, state é o parâmetro de filtro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para obter resultados com consultas de busca avançadas em vez de filtros básicos, pode-se usar vários parâmetros em uma URI para solicitar a busca de um recurso do servidor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123/posts?state=published&amp;amp;ta=scala
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A consulta acima busca por posts que são publicados com a tag Scala. Hoje em dia, é muito comum usar o Solr como ferramenta de busca, pois ele oferece capacidades avançadas para buscar um documento e você pode projetar sua API da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/123/posts?q=sometext&amp;amp;fq=state:published,ta:scala
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso buscará posts para texto livre "sometext" (q) e filtrará os resultados em fq state como publicado e tendo a tag Scala.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ordenação:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os parâmetros de ordenação ASC e DESC podem ser passados na URL, como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123/posts?sort=-updated_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retorna posts ordenados em ordem decrescente de data e hora de atualização.&lt;/p&gt;




&lt;h2&gt;
  
  
  HATEOAS
&lt;/h2&gt;

&lt;p&gt;HATEOAS (Hypermedia As The Engine Of Application State) é uma restrição da arquitetura REST que permite que um cliente navegue facilmente através de um recurso e suas ações disponíveis sem precisar conhecer como interagir com o aplicativo. Os metadados são incorporados nas respostas do servidor, o que torna a navegação mais fácil.&lt;br&gt;
Para entender melhor, vamos analisar a resposta abaixo de recuperação do usuário com o ID 123 do servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"self"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"posts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123/posts"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123/address"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em alguns casos, pode ser mais simples omitir o formato de links e incluir os links como campos dentro de um recurso, como exemplificado abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"self"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"posts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/users/123/address"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A decisão de especificar links como campos de um recurso ou usar o formato de links depende do tamanho e dos campos dos recursos, bem como das ações que podem ser executadas neles. Quando os recursos contêm muitos campos que o usuário pode não querer percorrer, é recomendável fornecer navegação para sub-recursos e implementar o HATEOAS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Autenticação e autorização sem estado
&lt;/h2&gt;

&lt;p&gt;A autenticação e autorização em APIs REST devem ser stateless. Cada solicitação deve ser auto-suficiente e atendida sem conhecimento da solicitação anterior. Isso é especialmente importante para autorizar ações de usuários.&lt;/p&gt;

&lt;p&gt;Anteriormente, os desenvolvedores armazenavam as informações do usuário em sessões no lado do servidor, o que não é uma abordagem escalável. Por isso, cada solicitação deve conter todas as informações de um usuário (se for uma API segura), em vez de depender de solicitações anteriores.&lt;/p&gt;

&lt;p&gt;Isso não limita as APIs a um usuário como uma pessoa autorizada, já que também permite a autorização de serviço para serviço. Para autorização de usuário, a combinação de JWT (JSON Web Token) com OAuth2 oferece uma maneira de alcançar isso. Além disso, para comunicação de serviço para serviço, tente passar a chave da API criptografada no cabeçalho.&lt;/p&gt;




&lt;h2&gt;
  
  
  Swagger para documentação
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://swagger.io/"&gt;Swagger&lt;/a&gt; é uma ferramenta popular para documentação de APIs REST, fornecendo uma maneira de explorar o uso de uma API específica e permitindo que os desenvolvedores entendam o comportamento semântico subjacente. Além disso, existem vários plugins disponíveis para diversas linguagens de programação que permitem gerar o Swagger automaticamente a partir do código-fonte. Esses plugins podem ser facilmente integrados às ferramentas de construção de software existentes, tornando a documentação da API uma parte fácil e automatizada do processo de desenvolvimento. Algumas opções populares incluem o swagger-jaxrs-doclet para Java, o Swashbuckle para .NET, o Flask-RESTPlus para Python e o SpringFox para Spring Framework. Com esses plugins, é possível gerar documentação de API atualizada e precisa com apenas algumas linhas de código.&lt;/p&gt;




&lt;h2&gt;
  
  
  Códigos de status HTTP
&lt;/h2&gt;

&lt;p&gt;Use códigos de status HTTP para fornecer a resposta a um cliente. Pode ser uma resposta de sucesso ou falha, mas deve definir o que o sucesso ou falha respectivo significa do ponto de vista do servidor.&lt;/p&gt;

&lt;p&gt;Abaixo estão as categorias de respostas por seus códigos de status:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2xx Sucesso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;200 OK: Retornado por uma operação GET ou DELETE bem-sucedida. PUT ou POST também podem usar isso, se o serviço não quiser retornar um recurso de volta ao cliente após a criação ou modificação.&lt;/p&gt;

&lt;p&gt;201 Created: Resposta para uma criação de recurso bem-sucedida por uma solicitação POST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3xx Redirecionamento&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;304 Not Modified: Usado se o cabeçalho de cache HTTP for implementado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4xx Erros do cliente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;400 Bad Request: Quando o corpo da solicitação HTTP não pode ser analisado. Por exemplo, se uma API estiver esperando um corpo em formato JSON para uma solicitação POST, mas o corpo da solicitação estiver malformado.&lt;/p&gt;

&lt;p&gt;401 Unauthorized: A autenticação não foi bem-sucedida (ou as credenciais não foram fornecidas) ao acessar a API.&lt;/p&gt;

&lt;p&gt;403 Forbidden: Se um usuário não está autorizado a realizar uma ação, embora as informações de autenticação estejam corretas.&lt;/p&gt;

&lt;p&gt;404 Not Found: Se o recurso solicitado não estiver disponível no servidor.&lt;/p&gt;

&lt;p&gt;405 Method Not Allowed: Se o usuário estiver tentando violar um contrato de API, por exemplo, tentando atualizar um recurso usando um método POST.&lt;/p&gt;

&lt;p&gt;409 Conflict: O servidor não pôde completar a solicitação devido a um conflito com o estado atual do recurso.&lt;/p&gt;

&lt;p&gt;422 Unprocessable Entity: O servidor entende o tipo de conteúdo da solicitação, mas não pode processá-lo devido a erros semânticos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5xx Erros do servidor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esses erros ocorrem devido a falhas do servidor ou problemas com a infraestrutura subjacente.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;É importante lembrar que esses são alguns dos status codes mais comuns e amplamente utilizados. Existem muitos outros códigos de status HTTP que podem ser usados para fornecer uma resposta mais precisa ao cliente. Para obter uma lista completa e detalhada de todos os códigos de status HTTP, você pode acessar a documentação oficial no seguinte link: &lt;a href="https://datatracker.ietf.org/doc/html/rfc7231"&gt;https://datatracker.ietf.org/doc/html/rfc7231&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;É importante lembrar que seguir as boas práticas de design de APIs RESTful não só torna a API mais fácil de usar, mas também melhora a segurança, escalabilidade e manutenção do serviço. Ao utilizar os padrões e princípios discutidos neste artigo, você poderá criar APIs mais confiáveis, flexíveis e fáceis de evoluir. Além disso, a maturidade das APIs pode ser facilmente documentada usando o &lt;a href="https://restfulapi.net/richardson-maturity-model/"&gt;Modelo de Maturidade Richardson&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>rest</category>
      <category>restfull</category>
    </item>
    <item>
      <title>Enum ou Enumerations no PHP</title>
      <dc:creator>Marcello Gonçalves</dc:creator>
      <pubDate>Sun, 05 Mar 2023 15:31:44 +0000</pubDate>
      <link>https://dev.to/marcellorg/enum-ou-enumerations-no-php-2a12</link>
      <guid>https://dev.to/marcellorg/enum-ou-enumerations-no-php-2a12</guid>
      <description>&lt;p&gt;Neste artigo, veremos a funcionalidade de Enums no PHP v8.1, o que são casos puros e com suporte em Enums e a diferença entre classes regulares e Enums.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe Básica
&lt;/h2&gt;

&lt;p&gt;O PHP 8.1 utiliza a palavra-chave enum para declarar Enums. A sintaxe é semelhante à sintaxe de traits, classes e interfaces. Veja como fica um enum simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Junior&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Pleno&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Senior&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Especialista&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A palavra-chave &lt;code&gt;case&lt;/code&gt; é usada para descrever os valores específicos que o Enum aceita. Os casos do Enum são referenciados da mesma forma que as constantes de classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$nivel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Especialista&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A vantagem dos enums é que eles abordam uma coleção de valores constantes. Enums agem basicamente da mesma maneira que classes e interfaces. Portanto, é possível fazer uma tipagem de que uma função aceite apenas um valor definido em um enum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Programador&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;Senioridade&lt;/span&gt; &lt;span class="nv"&gt;$nivel&lt;/span&gt;
    &lt;span class="p"&gt;){}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, você pode passar o Enum &lt;code&gt;Senioridade&lt;/code&gt; na classe &lt;code&gt;Programador&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$programador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Programador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Marcello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Especialista&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Backed enum (definindo valores)
&lt;/h2&gt;

&lt;p&gt;Os valores do Enum são representados internamente por objetos, mas você pode atribuir um valor a eles se quiser; isso é útil, por exemplo, para serializá-los em um banco de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Junior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Pleno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Senior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Especialista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, o enum &lt;code&gt;Senioridade&lt;/code&gt; foi modificado para criar um enum suportado do tipo &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aqui estão algumas regras para Enums suportados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele deve declarar o tipo escalar na declaração do Enum. E apenas &lt;code&gt;string&lt;/code&gt; ou &lt;code&gt;int&lt;/code&gt; são permitidos.&lt;/li&gt;
&lt;li&gt;Ele deve atribuir um valor para todos os casos.&lt;/li&gt;
&lt;li&gt;Os valores atribuídos a cada caso devem ser do mesmo tipo escalar.&lt;/li&gt;
&lt;li&gt;Não deve conter casos ou valores duplicados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para obter o valor atribuído, utilize a propriedade &lt;code&gt;-&amp;gt;value&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$programador&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nivel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas, caso precise obter o nome, utilize a propriedade &lt;code&gt;-&amp;gt;name&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$programador&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nivel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Valor Escalar para Enum
&lt;/h2&gt;

&lt;p&gt;Quando queremos obter de volta o valor escalar para o Enum, podemos utilizar o método &lt;code&gt;from()&lt;/code&gt;. Este método recebe o valor de string ou inteiro e o converte de volta para o Enum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Senior&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se um valor for passado que não corresponda aos valores permitidos, haverá um erro fatal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// PHP fatal error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima resultará em um erro fatal do PHP, pois o valor "100" não está presente no enum Senioridade.&lt;br&gt;
Para tornar isso mais seguro, o PHP 8.1 nos fornece um método &lt;code&gt;tryFrom()&lt;/code&gt; que retornará nulo em vez de lançar um erro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tryFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Métodos em enums
&lt;/h2&gt;

&lt;p&gt;Enums podem conter métodos. Eles também suportam modificadores de visibilidade de método padrão, bem como métodos estáticos.&lt;br&gt;
Por exemplo, declarando um método &lt;code&gt;label(): string&lt;/code&gt; que retorna uma etiqueta amigável para um caso de enumeração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Junior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Pleno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Senior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Especialista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Junior&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Dev Junior"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Pleno&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Dev Pleno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Senior&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Dev Sênior"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Especialista&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Dev Especialista"&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para obter o valor da label, é só chamar o método que criamos  &lt;code&gt;label()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$programador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Programador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Marcello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Especialista&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$programador&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nivel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Dev Especialista&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Listando valores de enums
&lt;/h2&gt;

&lt;p&gt;Você pode usar o método estático &lt;code&gt;Enum::cases()&lt;/code&gt; para obter uma lista de todos os casos disponíveis dentro de um enum. Este método retorna uma matriz contendo os objetos enum reais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Senioridade&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;cases&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;Esse é o grosso de um enum, mas existem muitas outras coisas que podem ser exploradas ao usar enums, as quais podem ser conferidas no RFC (Request for Comments).&lt;br&gt;
Aqui está o link da RFC para a leitura completa:&lt;br&gt;
&lt;a href="https://wiki.php.net/rfc/enumerations" rel="noopener noreferrer"&gt;https://wiki.php.net/rfc/enumerations&lt;/a&gt; &lt;/p&gt;

</description>
      <category>introduction</category>
      <category>saas</category>
      <category>api</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Acessando rotas protegidas CSRF ou autenticadas do Laravel com o Postman</title>
      <dc:creator>Marcello Gonçalves</dc:creator>
      <pubDate>Tue, 28 Feb 2023 01:33:15 +0000</pubDate>
      <link>https://dev.to/marcellorg/acessando-rotas-protegidas-csrf-ou-autenticadas-do-laravel-com-o-postman-pok</link>
      <guid>https://dev.to/marcellorg/acessando-rotas-protegidas-csrf-ou-autenticadas-do-laravel-com-o-postman-pok</guid>
      <description>&lt;p&gt;As vezes precisamos acessar rotas autenticadas ou rotas protegidas com o CSRF com o Postman para fazermos testes, abaixo vou mostrar como conseguimos fazer o login e pegar o valor do token sem precisar excluir URIs da proteção CSRF .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lembrando que o postman é para testes de api, mas se por algum motivo precisarem acessar rotas que não sejam de api segue a dica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;1 - Criar o ambiente no postman&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Environment name: Meu projeto
key: url 
value: http://127.0.0.1:8000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sijcBSX4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qfwg6a71akkaqm0uc5od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sijcBSX4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qfwg6a71akkaqm0uc5od.png" alt="Environment postamn" width="880" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 - Agora você pode usar o endpoint com a variável criada no meu caso url , então ficaria assim: &lt;code&gt;{{url}}/login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3 - Adicione o código abaixo na seção &lt;strong&gt;Tests&lt;/strong&gt; para criar a variável chamada &lt;em&gt;xsrf-token&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;xsrfCookie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;postman&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getResponseCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;XSRF-TOKEN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;xsrfToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;decodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;XSRF-TOKEN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xsrf-token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;xsrfToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LoKv_Hzh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1u8pmecfir65er7w65o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LoKv_Hzh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1u8pmecfir65er7w65o4.png" alt="postman tests" width="687" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 - Na seção &lt;strong&gt;Headers&lt;/strong&gt; adiciona as seguintes variáveis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content-Type:application/x-www-form-urlencoded
X-XSRF-TOKEN:{{xsrf-token}}
Accept:application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kigdyoKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tzigzt50bogywn8684ti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kigdyoKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tzigzt50bogywn8684ti.png" alt="postman headers" width="758" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5 - Agora você já pode enviar a solicitação POST para efetuar o login, não esqueçam de colocar no &lt;strong&gt;Body&lt;/strong&gt; os campos &lt;code&gt;email&lt;/code&gt; e &lt;code&gt;password&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5wbVTkDu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdvyv08akoosxr3yz1zb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5wbVTkDu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdvyv08akoosxr3yz1zb.png" alt="postman auth" width="752" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postman</category>
      <category>laravel</category>
      <category>api</category>
      <category>php</category>
    </item>
  </channel>
</rss>
