<?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: Arthur Guimarães</title>
    <description>The latest articles on DEV Community by Arthur Guimarães (@artgmrs).</description>
    <link>https://dev.to/artgmrs</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%2F595185%2Fa56b0f0b-b9ce-4046-ad7c-9e95632da01e.jpg</url>
      <title>DEV Community: Arthur Guimarães</title>
      <link>https://dev.to/artgmrs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artgmrs"/>
    <language>en</language>
    <item>
      <title>Como fazer web scrape com Node.js</title>
      <dc:creator>Arthur Guimarães</dc:creator>
      <pubDate>Sun, 05 Mar 2023 23:06:32 +0000</pubDate>
      <link>https://dev.to/artgmrs/como-fazer-web-scrape-com-nodejs-3bbf</link>
      <guid>https://dev.to/artgmrs/como-fazer-web-scrape-com-nodejs-3bbf</guid>
      <description>&lt;h2&gt;
  
  
  Como fazer web scrape com Node.js
&lt;/h2&gt;

&lt;p&gt;Esse tutorial é indicado para iniciantes em Web scraping ou caso você precise saber quais recursos utilizar para realizar essa tarefa no Node.js. Você verá a poderosa combinação do Node.js + Cheerio + Axios para a raspagem de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré requisitos
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;NodeJs 18+ e npm 8+&lt;/a&gt;: Qualquer versão do Node.js 18+ com o npm é suficiente.&lt;/li&gt;
&lt;li&gt;Uma IDE ou editor de código de sua preferência. Recomendamos o &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;, o qual foi utilizado pra criação desse tutorial.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Desejável:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Conhecimento básico de javascript e chamadas HTTP - mas se não tiver, tudo bem também, vou explicar um pouco mais no decorrer do tutorial e você pode aprofundar depois :)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mão na massa
&lt;/h2&gt;

&lt;p&gt;Crie uma nova pasta e inicie um projeto javascript:&lt;/p&gt;

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


npm init -y



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Adicione as bibliotecas do &lt;code&gt;axios&lt;/code&gt; e &lt;code&gt;cheerio&lt;/code&gt;:&lt;/p&gt;

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


npm install axios cheerio



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Na raiz da pasta crie o arquivo &lt;code&gt;ìndex.js&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5sedcld91jb60mtci8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5sedcld91jb60mtci8c.png" alt="Estrutura de pastas do projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;index.js&lt;/code&gt; faça a importação do &lt;code&gt;cheerio&lt;/code&gt; e &lt;code&gt;axios&lt;/code&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;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cheerio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ainda no &lt;code&gt;index.js&lt;/code&gt; crie o método &lt;code&gt;executeScrape()&lt;/code&gt; e faça a chamada dele ao final do arquivo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;executeScrape&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;span class="nf"&gt;executeScrape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora utilizaremos o axios para fazer a chamada ao website que desejamos fazer a &lt;code&gt;raspagem de dados&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;💡O axios é utilizado para realizarmos chamadas HTTP para outros sistemas. No nosso projeto o usaremos para fazer um request &lt;code&gt;GET&lt;/code&gt; e recuperar o HTML do site o qual nós faremos a raspagem dos dados. Para aprofundar no axios acesse a &lt;a href="https://axios-http.com/docs/intro" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neste tutorial vamos usar o site do &lt;a href="https://nodebr.org" rel="noopener noreferrer"&gt;NodeBr&lt;/a&gt; para recuperar os dados da aba "Quem somos":&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;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://nodebr.org/sobre/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;executeScrape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;executeScrape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Execute o programa para validar o retorno do axios:&lt;/p&gt;

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

node index.js


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ao executar o programa devemos ver o HTML da página logado no console:&lt;/p&gt;

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

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en-US"&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset="UTF-8"&amp;gt;
&amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
&amp;lt;title&amp;gt;Quem Somos &amp;amp;#8211; NodeBR&amp;lt;/title&amp;gt;
...


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora utilizaremos o &lt;code&gt;cheerio&lt;/code&gt; para ler o HTML retornado pelo axios e simula-lo em uma espécie de estrutura de DOM virtual, onde conseguiremos realizar consultas utilizando seletores CSS.&lt;/p&gt;

&lt;p&gt;💡O Cheerio analisa o HTML e fornece uma API para percorrer/manipular a estrutura de dados. Especificamente, ele não produz uma renderização visual, aplica CSS, carrega recursos externos ou executa JavaScript que é comum para um SPA (aplicativo de página única). Isso torna o Cheerio muito, muito mais rápido do que outras soluções. Mais informações acesse a &lt;a href="https://cheerio.js.org/docs/intro" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Podemos nos livrar do &lt;code&gt;console.log(data)&lt;/code&gt; e faremos o carregamento do HTML no &lt;code&gt;cheerio&lt;/code&gt; a partir do método &lt;code&gt;load()&lt;/code&gt;, atribuindo o retorno para a variável &lt;code&gt;$&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;executeScrape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;Pronto, agora podemos realizar consultas utilizando seletores CSS a partir da variável &lt;code&gt;$&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;💡Seletores CSS são padrões usados para selecionar elementos no HTML. &lt;a href="https://www.w3schools.com/cssref/css_selectors.php" rel="noopener noreferrer"&gt;Referência aqui&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Para descobrir qual seletor usar para recuperar os dados que queremos vamos acessar a página &lt;a href="https://nodebr.org/sobre/" rel="noopener noreferrer"&gt;https://nodebr.org/sobre/&lt;/a&gt; e selecionar Inspecionar  (ou apertar o comando &lt;code&gt;CTRL + SHIFT + C&lt;/code&gt; que também abre o seletor) e verificar a árvore HTML da página.&lt;/p&gt;

&lt;p&gt;Podemos ver que o texto de "Quem somos" fica em um parágrafo dentro de uma &lt;code&gt;div&lt;/code&gt; com a classe "entry-content":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1od10zbbu699747pzeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1od10zbbu699747pzeg.png" alt="Estrutura HTML do site nodebr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O seletor que retorna a informação que queremos é o &lt;code&gt;'div.entry-content &amp;gt; p'&lt;/code&gt;. Para realizar a consulta utilizando um seletor podemos passa-lo para a variável &lt;code&gt;$&lt;/code&gt;. Por fim, usamos o método &lt;code&gt;text()&lt;/code&gt; para extrair o texto do parágrafo (este método funciona em outras tags HTML também!):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;executeScrape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entryContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div.entry-content &amp;gt; p&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entryContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// A NodeBR é a maior comunidade brasileira de Node.js. Com uma organização descentralizada oferecemos ajuda, dicas, eventos e todo tipo de recursos gratuitos para que a plataforma Node.js possa ganhar tração no Brasil.&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Prontinho, temos nosso web scraper feito com Node.js + Cheerio + Axios :)&lt;/p&gt;

&lt;p&gt;Caso precise consultar o código final do projeto, basta acessar o &lt;a href="https://github.com/artgmrs/scraper-nodejs" rel="noopener noreferrer"&gt;repositório on github&lt;/a&gt; - não esqueça de deixar um like por lá :) &lt;/p&gt;

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

</description>
      <category>node</category>
      <category>webscrap</category>
      <category>cheerio</category>
      <category>javascript</category>
    </item>
    <item>
      <title>CORS: o que é e onde resolver os problemas relacionados a ele?</title>
      <dc:creator>Arthur Guimarães</dc:creator>
      <pubDate>Fri, 21 Oct 2022 18:30:34 +0000</pubDate>
      <link>https://dev.to/artgmrs/cors-o-que-e-e-onde-resolver-os-problemas-relacionados-a-ele-10nk</link>
      <guid>https://dev.to/artgmrs/cors-o-que-e-e-onde-resolver-os-problemas-relacionados-a-ele-10nk</guid>
      <description>&lt;h2&gt;
  
  
  Cross Origin Resource Sharing (CORS)
&lt;/h2&gt;

&lt;p&gt;É uma restrição imposta apenas pelo navegador (e somente ele) para que somente domínios autorizados possam acessar os dados no servidor por meio de scripts, seja ele &lt;code&gt;XMLHttpRequest&lt;/code&gt; ou &lt;code&gt;Fetch API&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A validação funciona por meio de cabeçalhos HTTP que são enviados pelo &lt;em&gt;servidor&lt;/em&gt;, ou seja, pela resposta que é recebida ao fazer um fetch de dados pelo navegador.&lt;/p&gt;

&lt;p&gt;Os cabeçalhos principais são dois:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Origin - Define quais as origens (domínios) que tem permissão para acessar o servidor&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Methods - Define quais métodos podem ser acessados pelas origens permitidas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo da resposta do servidor (usando o site do Twitter como exemplo), informando quais são os domínios que podem ter acesso aos dados (nesse caso apenas '&lt;a href="https://twitter.com/"&gt;https://twitter.com&lt;/a&gt;'):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56ge46nbkao911lj3d5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56ge46nbkao911lj3d5b.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/56ge46nbkao911lj3d5b.png" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A validação é realizada pelo navegador porém quem controla esse acesso é o servidor. Ao contrário do que muitos pensam, a correção para problemas relacionados à CORS é sempre no servidor (back-end).&lt;/p&gt;

&lt;p&gt;Em algumas requisições, é necessário enviar uma request preliminar chamada de preflighted request. Ela utiliza o método OPTIONS do HTTP, informando o método e domínio que será invocado para assim garantir que a requisição seguinte possa ser realizada. &lt;/p&gt;

&lt;p&gt;Referência: &lt;a href="https://www.treinaweb.com.br/blog/o-que-e-cors-e-como-resolver-os-principais-erros"&gt;https://www.treinaweb.com.br/blog/o-que-e-cors-e-como-resolver-os-principais-erros&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Segurança
&lt;/h2&gt;

&lt;p&gt;CORS é mais uma camada de segurança que sua aplicação pode usar para evitar acessos de terceiros não autorizados, mal intencionados ou não. Caso não haja uma barreira de CORS um ataque de brute fica um pouco mais complicado de ser feito contra a sua aplicação.&lt;/p&gt;

&lt;p&gt;Mas lembrando, CORS não garante a segurança de sua aplicação! É apenas uma das várias opções e você deve sempre se manter o máximo seguro.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são domínios diferentes?
&lt;/h2&gt;

&lt;p&gt;O mesmo domínio que o/do servidor é aceito automaticamente. Porém, domínios distintos* devem ser configurados &lt;strong&gt;no servidor&lt;/strong&gt; para que o acesso seja liberado.&lt;/p&gt;

&lt;p&gt;*O navegador considera como um domínio distinto quando ele é diferente da origem em: domínio do site, protocolo ou porta&lt;br&gt;
Exemplo:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhwx0sokg2lmpeaphr24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhwx0sokg2lmpeaphr24.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhwx0sokg2lmpeaphr24.png" width="800" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nem todas as requisições realizadas no front necessitam de acesso explícito no CORS. Aqui estão as que necessitam:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chamadas &lt;code&gt;XMLHttpRequest&lt;/code&gt; ou &lt;code&gt;Fetch API&lt;/code&gt; quando a comunicação é feita entre origens (domínios) diferentes.&lt;/li&gt;
&lt;li&gt;Web Fonts (para o uso de fontes em &lt;code&gt;@font&lt;/code&gt; no CSS)&lt;/li&gt;
&lt;li&gt;Texturas WebGL&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Frames&lt;/em&gt; de Imagens/vídeos desenhados em uma tela usando &lt;code&gt;drawImage()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Referência: &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/CORS#quais_solicita%C3%A7%C3%B5es_usam_o_cors"&gt;https://developer.mozilla.org/pt-BR/docs/Web/HTTP/CORS#quais_solicitações_usam_o_cors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cors</category>
      <category>servidor</category>
      <category>backend</category>
    </item>
    <item>
      <title>Uso básico de git</title>
      <dc:creator>Arthur Guimarães</dc:creator>
      <pubDate>Mon, 14 Jun 2021 17:45:36 +0000</pubDate>
      <link>https://dev.to/artgmrs/uso-basico-de-git-590c</link>
      <guid>https://dev.to/artgmrs/uso-basico-de-git-590c</guid>
      <description>&lt;h1&gt;
  
  
  Mais um post de git?
&lt;/h1&gt;

&lt;p&gt;Quando eu estava aprendendo git, o mais comum era ter que pesquisar mais uma vez comandos que já havia utilizado, e com a diversidade deles acabava me perdendo ou me confundindo ainda mais.&lt;br&gt;
Criei esse pequeno "esquema" para que eu pudesse consultar facilmente, coloquei todos os comandos que pessoalmente mais utilizo, e caso apareça algo novo eu simplesmente adiciono à minha lista. Sem ter que olhar trocentos comandos/sites até encontrar exatamente o que preciso.&lt;/p&gt;

&lt;p&gt;Me ajudou bastante à decorar os comandos básicos e espero que possa ajudar alguém também. Aqui vão os comandos:&lt;/p&gt;
&lt;h2&gt;
  
  
  Criar uma branch
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout master
git pull
git checkout -b &amp;lt;nome_da_branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Criar uma branch a partir da branch atual
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout master
git pull
git checkout &amp;lt;branch_que_já_existe&amp;gt;
git checkout -b &amp;lt;nome_nova_branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Deletar uma branch local
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -d &amp;lt;nome_branch_local&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Renomear uma branch local
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout &amp;lt;branch_que_sera_alterada&amp;gt;
git branch -m &amp;lt;novo_nome&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Enviar uma branch local para o repositório remoto
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin &amp;lt;nome_branch_local&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Deletar uma branch no repositório remoto
&lt;/h2&gt;

&lt;p&gt;Para deletar uma branch remota, é preciso usar o comando "git push" com a opção "--delete":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin --delete &amp;lt;nome_branch_remota&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Merge na branch local a partir de master
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>workflow</category>
      <category>tips</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>How to improve as a Developer (personal tips)</title>
      <dc:creator>Arthur Guimarães</dc:creator>
      <pubDate>Sun, 18 Apr 2021 23:32:22 +0000</pubDate>
      <link>https://dev.to/artgmrs/how-to-improve-as-a-developer-personal-tips-33cl</link>
      <guid>https://dev.to/artgmrs/how-to-improve-as-a-developer-personal-tips-33cl</guid>
      <description>&lt;p&gt;In the beginning of my learning path, there was so many times where I wanted to increase my skills or just learn something new, but had no ideas for what to do. Or even moments where there were so many ideas and I didn’t know how to start any of them. I used to struggle to keep my focus when learning something new, or working in a new project I had planned.&lt;br&gt;
After some thinking and research, I’ve found some tips that helped me to decide what, and more important how to do that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh9p2pbuxm00cno2wg23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh9p2pbuxm00cno2wg23.png" alt="Alt Text" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;First of all, have you decided what you want to build or learn?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you have already decided which technology you want to learn or some project you want to build, or even just some little thing you want to improve in yourself? If yes, congratulations, you’ve done your homework (and you can go directly to the topic “How to organize yourself?”). But if not, you are in the same place as me in the beginning.&lt;br&gt;
Some ideas if you don’t have any yet are: Habits tracker; Work with a public API; Any new technology; Automate or solve any personal trouble (I really like this one); Weather Checker?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Sorry for that, but it is what it is.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After you choose what you want to do, break your entire project in small goals. Start with the closer to a “Hello World” you can.&lt;/p&gt;

&lt;p&gt;Fix this mindset: Make it work, after that make it beautiful. Don’t worry if your project doesn’t look so fancy, faster, or even well written. As a developer, we must understand the problem we’re facing, and the ability to break it in small steps is a huge helper. &lt;/p&gt;

&lt;p&gt;Take your time to do your things.&lt;br&gt;
As soon you start building your project’s base, the improvement will be so much smoother than if you had ran over the steps just to make it beautiful first.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I prefer an app that solve my problem, and you?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Some ideas that I think are great to challenge yourself (even if you have already build any of this, you may consider give it a try and make it better than last time).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Organize yourself&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Make a deal with yourself, and set how much time you want to spend it which day or in the entire week, and stick with it.&lt;br&gt;
If you are familiar with GIT, create your directory in Github (or any other place you like) and make sure to update your project frequently. Seeing your improves in the code will boost your will for finish it.&lt;/p&gt;

&lt;p&gt;That’s it. I hope I’ve helped you in some way. See you in later posts.&lt;/p&gt;

</description>
      <category>improvement</category>
      <category>developer</category>
      <category>softskills</category>
      <category>english</category>
    </item>
  </channel>
</rss>
