<?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>Forem: Gustavo Flôr</title>
    <description>The latest articles on Forem by Gustavo Flôr (@gustavoflor).</description>
    <link>https://forem.com/gustavoflor</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%2F1218261%2Fc3b87aa6-01dd-49b3-be71-b1cb8e82ab64.jpeg</url>
      <title>Forem: Gustavo Flôr</title>
      <link>https://forem.com/gustavoflor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gustavoflor"/>
    <language>en</language>
    <item>
      <title>O que é JSON? 🏒</title>
      <dc:creator>Gustavo Flôr</dc:creator>
      <pubDate>Fri, 24 Nov 2023 20:18:14 +0000</pubDate>
      <link>https://forem.com/gustavoflor/o-que-e-json-3g2g</link>
      <guid>https://forem.com/gustavoflor/o-que-e-json-3g2g</guid>
      <description>&lt;p&gt;Hoje vamos falar de JSON, uma tecnologia mainstream quando falamos de comunicação entre sistemas baseados em comunicação por rede, o objetivo é entendermos suas características e principalmente os motivadores para ser tão utilizado.&lt;/p&gt;

&lt;p&gt;Vem comigo…&lt;/p&gt;




&lt;p&gt;O acrônimo JSON vem de JavaScript Object Notation, é um formato leve para gravar e transportar dados, é utilizado comumente na comunicação entre aplicações cliente-servidor, é “auto descritivo” e fácil de entender.&lt;/p&gt;

&lt;p&gt;Aqui um simples 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"filmes"&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;"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;"Os Oito Odiados"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"dirigidoPor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Quentin Tarantino"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"elenco"&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="s2"&gt;"Samuel L. Jackson"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jennifer Jason Leigh"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"ano"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"premiado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"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;"Bastardos Inglórios"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"dirigidoPor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Quentin Tarantino"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"elenco"&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="s2"&gt;"Brad Pitt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Christoph Waltz"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"ano"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"premiado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Como pode notar, sem muita dificuldade é possível identificar que estamos recebendo uma representação de uma lista de filmes do diretor Quentin Tarantino.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Os dados são escritos em pares no formato chave-valor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chave&lt;/strong&gt;: Deve definir o nome do atributo, precisa ser escrito com aspas duplas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valor&lt;/strong&gt;: Pode ser uma &lt;em&gt;string&lt;/em&gt;, &lt;em&gt;boolean&lt;/em&gt;, &lt;em&gt;number&lt;/em&gt;, &lt;em&gt;array&lt;/em&gt;, &lt;em&gt;object&lt;/em&gt; ou até mesmo &lt;em&gt;null&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Os dados são separados por vírgulas&lt;/li&gt;
&lt;li&gt;As chaves (&lt;code&gt;{&lt;/code&gt; e &lt;code&gt;}&lt;/code&gt;) definem um &lt;em&gt;object&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Os colchetes (&lt;code&gt;[&lt;/code&gt; e &lt;code&gt;]&lt;/code&gt;) definem um &lt;em&gt;array&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Características
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fácil de entender
&lt;/h3&gt;

&lt;p&gt;JSON é simples para nós humanos lermos e escrevermos, o que faz dele uma escolha popular para arquivos de configuração e transporte de dados entre diferentes serviços.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agnóstico a linguagem
&lt;/h3&gt;

&lt;p&gt;JSON não é atrelado a nenhuma linguagem de programação e é suportado por uma enorme gama de linguagens, o que torna ele super adaptável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leve
&lt;/h3&gt;

&lt;p&gt;JSON é leve considerando que não carrega consigo informações “desnecessárias” para representar um dado, o que faz dele eficiente para ser utilizado na comunicação entre sistemas.&lt;/p&gt;

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

&lt;p&gt;JSON é um formato bem similar a criar objetos no JavaScript, com algumas pequenas diferenças, por exemplo a obrigação de utilizar aspas duplas no nome dos atributos&lt;/p&gt;

&lt;p&gt;Comumente utilizado no estilo arquitetural REST, em conjunto do HTTP, não sabe o que é REST? Clique aqui e saiba mais.&lt;/p&gt;

&lt;p&gt;Mesmo com a similaridade com o JavaScript, qualquer linguagem de programação pode ler e escrever JSON, e essa sem dúvida é uma das principais razões da popularidade dessa tecnologia, em conjunto com a ideia de ser fácil de entender e ser auto descritivo, que ajuda muito também.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/whatis/whatis_json.asp"&gt;https://www.w3schools.com/whatis/whatis_json.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://restfulapi.net/json/"&gt;https://restfulapi.net/json/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>json</category>
    </item>
    <item>
      <title>O que é REST? 😴</title>
      <dc:creator>Gustavo Flôr</dc:creator>
      <pubDate>Fri, 24 Nov 2023 20:13:51 +0000</pubDate>
      <link>https://forem.com/gustavoflor/o-que-e-rest-1bb9</link>
      <guid>https://forem.com/gustavoflor/o-que-e-rest-1bb9</guid>
      <description>&lt;p&gt;Se você pensou em descanso, lamento ter que informar, porém não será o tema do artigo de hoje, na verdade vamos falar sobre um estilo de arquitetura de software, em algumas literaturas também chamado de padrão arquitetural, e não vamos confundir com padrões de projeto (Design Patterns), um estilo arquitetural nada mais é que um guia de princípios/restrições que um software precisa contemplar para atingir determinado objetivo, agora vamos entender melhor o que é REST…&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;REST é um acrônimo para REpresentational State Transfer, em uma tradução livre transferência de estado representacional, o termo foi apresentado por Roy Fielding nos anos 2000, é um estilo arquitetural para sistemas distribuídos de hipermídia (distributed hypermedia systems), melhor dizendo, REST é um estilo arquitetural híbrido, é uma combinação de diversos outros estilos arquiteturais de software baseados em comunicação via rede, e agregados com algumas regras e critérios que então unidos formam um contrato homogêneo para arquitetura de um software para a web moderna.&lt;/p&gt;

&lt;p&gt;Talvez você tenha ficado confuso com o termo hipermídia (hypermedia), apesar do termo não ser muito comum e utilizado na atualidade, nada mais é do que a capacidade de conseguirmos conectar informações em diferentes lugares da web através de links e/ou outras formas de redirecionamento, por exemplo o HTML (tecnologia presente em todos os sites da web) é uma HyperText Markup Language (linguagem de marcação de hipertexto), quando falamos de hipermídia, estamos dizendo que vamos além do texto apenas, tratando de imagens, documentos, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípios fundamentais
&lt;/h2&gt;

&lt;p&gt;Serviços que seguem estes princípios (em sua totalidade) são denominados RESTful, e um serviço aplica estes 6 princípios está propenso a melhorar sua performance, confiabilidade (reliability) e a re-usabilidade, pois seus componentes podem ser modificados de forma incremental sem afetar o sistema como um todo.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Client-Server
&lt;/h3&gt;

&lt;p&gt;Este princípio dita que precisamos desacoplar o consumidor do serviço do fornecedor do serviço em duas diferentes entidades, chamadas respectivamente de client (cliente) e server (servidor), separando essas responsabilidades conseguimos garantir que cada entidade consegue evoluir de forma independente, sem precisar conhecer do contexto da outra entidade.&lt;/p&gt;

&lt;p&gt;O client é responsável pela interface do usuário e sua experiência, tendo como objetivo principal lidar com a apresentação dos dados para o usuário e manipular as ações solicitadas pelo usuário.&lt;/p&gt;

&lt;p&gt;O server é responsável pelas regras de negócio, por persistir os dados, gerenciar como o dado será criado e alterado, e principalmente disponibilizar uma interface para que o client consiga realizar operações nos dados armazenados.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Stateless
&lt;/h3&gt;

&lt;p&gt;Em um serviço RESTful, toda requisição (partindo do client) deve conter todas as informações que o servidor precisa para completar a operação requisitada, sem que o servidor precise de qualquer estado guardado em memória, ou seja, o servidor não vai armazenar nada sobre as requisições que já foram feitas, toda requisição é vista como uma nova requisição, nenhuma informação de sessão fica retida no servidor.&lt;/p&gt;

&lt;p&gt;Este princípio garante que cada requisição pode ser entendida e executada isoladamente, o que permite que a aplicação se torne escalável (scalability) e confiável (reliability).&lt;/p&gt;

&lt;p&gt;É importante notar que, como qualquer outra escolha arquitetural, temos um trade-off ao escolher um serviço stateless, ganhamos em escalabilidade, porém temos a desvantagem que diminuir a performance na conexão com a rede, pois precisamos enviar dados repetidos em diversos momentos (pois este dado não pode ficar do lado do servidor em um contexto compartilhado).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cache
&lt;/h3&gt;

&lt;p&gt;Para melhorar a eficiência no uso de rede, REST diz que os clientes podem realizar o cache das respostas, porém, é importante notar que as respostas devem ser implícita ou explicitamente identificadas como cacheaveis (cacheable) ou não cacheaveis (non-cacheable). Se a reposta for cacheável, o cliente pode (note que não é um dever) re-utilizar a mesma resposta para solicitações semelhantes no futuro, com o cache conseguimos eliminar algumas interações entre as camadas cliente-servidor, ou seja, melhoramos performance e escalabilidade.&lt;/p&gt;

&lt;p&gt;O trade-off é que o cache pode diminuir a confiabilidade (reliability) da aplicação caso o cache não seja bem gerenciado, ou seja, o estado da resposta armazenada em memória é muito diferente do estado caso fosse feita uma nova requisição, por isto, é uma boa prática invalidar o cache após um determinado período, este período pode ser informado pelo servidor ou escolhido de forma lógica pelo próprio cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Uniform Interface
&lt;/h3&gt;

&lt;p&gt;Este é um dos princípios centrais da arquitetura de qualquer sistema RESTful. Com ele desacoplamos ainda mais os componentes cliente e servidor, transformando ainda mais em entidades independentes, basicamente a ideia aqui é definirmos contratos padronizados e específicos para nossas operações, se aqui conseguirmos estruturar um contrato uniforme em que ambas as partes conseguem se comunicar e se entender, conseguimos garantir que funcionem de forma cada vez mais independente.&lt;/p&gt;

&lt;p&gt;O trade-off deste princípio é que alguns contratos podem diminuir a eficiência das comunicações de rede, pois ao invés de transferirmos o dado da forma mais adequada para a operação, vamos transferir o dado de acordo com o contrato estabelecido.&lt;/p&gt;

&lt;p&gt;Vamos falar mais a frente sobre os elementos de dados que os contratos devem contemplar.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Layered Systems
&lt;/h3&gt;

&lt;p&gt;Este princípio permite que a arquitetura tenha diversas camadas entre os componentes de cliente e servidor, porém, de forma que o cliente não consiga ter visibilidade que não está conversando diretamente com o servidor, ou seja, as camadas devem ser transparentes e respeitarem o mesmo contrato do servidor, estas camadas adicionais podem ser proxies, load balancers, gateways, serviços de autenticação, etc. Com este princípio conseguimos garantir ainda mais desacoplamento entre as camadas e além disso recebermos benefícios como escalabilidade, confiabilidade e disponibilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Code-On-Demand (Opcional)
&lt;/h3&gt;

&lt;p&gt;De todos os princípios no mundo atual este é o menos utilizado, basicamente permite que o servidor transfira um código executável para o cliente, este é o único princípio opcional do REST. Este princípio pode simplificar o escopo de um cliente, já que pode receber partes de uma funcionalidade vinda diretamente do servidor, esse código pode ser passado através de scripts executáveis do lado do cliente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Elementos de dados
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Resources
&lt;/h5&gt;

&lt;p&gt;Os recursos (resources) são a principal abstração de uma informação no REST, eles são qualquer tipo de informação que possa ser nomeada: um documento, uma imagem, uma coleção de outros recursos, etc. Em outras palavras, qualquer conceito que possa ser referenciado pode ser definido com um recurso. No REST cada recurso deve ter um identificador único para que possa ser identificado durante a interação entre os componentes da arquitetura.&lt;/p&gt;

&lt;h5&gt;
  
  
  Resource representations
&lt;/h5&gt;

&lt;p&gt;A representação de um recurso, nada mais é do que o estado atual ou desejado de um determinado recurso, esta representação deve ser transferida entre cliente e servidor, cada representação pode ter um formato específico: JSON, XML, etc. Por exemplo, posso representar o recurso animal através de um JSON que inclua os campos raça, nome, tamanho e seu identificador.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que é JSON? Clique aqui e entenda.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Metadata
&lt;/h5&gt;

&lt;p&gt;Os metadados (metadata) são informações no formato chave-valor, onde podem ser passadas informações adicionais sobre o recurso ou sua representação, por exemplo, podemos informar nos metadados o formato da representação de um recurso, links referentes ao recurso (conectado a ideia de HATEOAS), etc.&lt;/p&gt;

&lt;h5&gt;
  
  
  Control Data
&lt;/h5&gt;

&lt;p&gt;Define o objetivo da requisição entre os componentes, como qual a operação esta sendo solicitada e qual o significado da resposta. Também pode ser utilizado para parametrizar a requisição e sobreescrever os comportamentos padrões, por exemplo, o comportamento de cache, rate limit, etc.&lt;/p&gt;

&lt;p&gt;O dados de controle (control data) podem parecer semelhantes aos metadados, porém uma divisão fácil e clara que podemos fazer é, metadados dizem sobre o recurso e/ou sua representação, os dados de controle dizem sobre a ação que será executada e seus comportamentos.&lt;/p&gt;

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

&lt;p&gt;Para fecharmos esse tema, como dito no ínicio REST é um estilo arquitetural híbrido, é uma evolução de outros modelos arquiteturais e carrega consigo principalmente a ideia de escalabilidade, confiabilidade e disponibilidade de uma aplicação baseada em comunicação de rede considerando suas principais as necessidades.&lt;/p&gt;

&lt;p&gt;O que REST não é?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bala de prata&lt;/li&gt;
&lt;li&gt;HTTP + JSON&lt;/li&gt;
&lt;li&gt;Padrão de projeto (Design Pattern)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O que REST é?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estilo arquitetural&lt;/li&gt;
&lt;li&gt;Adaptável&lt;/li&gt;
&lt;li&gt;Modelo para comunicação entre sistemas distribuídos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;https://ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://restfulapi.net/"&gt;https://restfulapi.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@alexandre.highrollers/restful-api-for-distributed-hypermedia-system-78dbfb8a58b9"&gt;https://medium.com/@alexandre.highrollers/restful-api-for-distributed-hypermedia-system-78dbfb8a58b9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rest</category>
      <category>distributedsystems</category>
    </item>
  </channel>
</rss>
