<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ API - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ API - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 28 May 2026 16:39:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/api/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ O que é uma API e como ela funciona? APIs para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ Quando comecei a aprender a programar, o termo API sempre me assombrava. Eu não conseguia entender o que realmente significava porque ouvia as pessoas falando sobre APIs em diferentes contextos. O maior desafio era que eu não conseguia encontrar recursos para aprender sobre APIs em termos simples. Agora que sei ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-uma-api-e-como-ela-funciona-apis-para-iniciantes/</link>
                <guid isPermaLink="false">66872e9223266d03fc8b83ba</guid>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kris Lagerström ]]>
                </dc:creator>
                <pubDate>Mon, 29 Jul 2024 12:49:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/07/api-article.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-apis-work/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is an API and How Does it Work? APIs for Beginners</a>
      </p><p>Quando comecei a aprender a programar, o termo API sempre me assombrava. Eu não conseguia entender o que realmente significava porque ouvia as pessoas falando sobre APIs em diferentes contextos.</p><p>O maior desafio era que eu não conseguia encontrar recursos para aprender sobre APIs em termos simples.</p><p>Agora que sei como as APIs funcionam, decidi escrever este guia para qualquer iniciante que tenha dificuldade para entender esse tópico que não é tão complicado, mas que ainda é confuso, em desenvolvimento para a web e em engenharia de software.</p><h2 id="o-que-uma-api">O que é uma API?</h2><p>API significa Interface de Programação de Aplicações. A aplicação pode ser qualquer software que execute uma tarefa específica e a interface é um ponto onde duas aplicações se comunicam.</p><p>Uma aplicação atua como <em>client</em> e o outro atua como servidor. Um <em>client</em> solicita algum recurso (por exemplo, uma foto) e o servidor envia essa foto para o <em>client</em>.</p><p>O <em>client</em>, aqui, pode ser seu celular, computador <em>desktop</em> ou <em>laptop</em> ou qualquer dispositivo que você usa para navegar na internet. O servidor é um computador maior, que armazena os dados que você deseja (uma foto, no nosso caso).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/07/unsplash-1.png" class="kg-image" alt="unsplash-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/07/unsplash-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/07/unsplash-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/07/unsplash-1.png 1353w" sizes="(min-width: 720px) 720px" width="1353" height="626" loading="lazy"></figure><p>Suponha que eu queira uma fotografia da natureza para enviar para meu blog de viagens. Eu posso ir ao site do Unsplash, digitar "natureza" na barra de pesquisa e ele retornará um grande número de fotografias da natureza.</p><p>Essa é uma API trabalhando nos bastidores para fazer a conversa entre o Unsplash e eu acontecer.</p><h2 id="como-as-apis-funcionam">Como as APIs funcionam?</h2><p>Os computadores seguem um protocolo para se comunicar uns com os outros. Um protocolo nada mais é do que um conjunto de regras que os computadores seguem para se comunicar. Qualquer computador que não siga o protocolo quebra o fio da comunicação.</p><p>Você pode ter usado Bluetooth para compartilhar dados no passado. Bluetooth nada mais é do que um protocolo para dispositivos móveis se comunicarem entre eles a uma distância menor.</p><p>Quando você pede ao seu amigo para enviar fotos de sua última viagem, seu dispositivo atua como <em>client</em> e o dispositivo do seu amigo (aquele que envia as fotos) é o servidor.</p><p>Esse é apenas um exemplo de protocolo. Temos um grande número de protocolos no mundo da ciência da computação – um para quase tudo.</p><p>Na web, usamos o protocolo HTTP (em inglês, <em>Hyper Text Transfer Protocol</em>). As APIs disponíveis na web usam o protocolo HTTP por vários motivos – é fácil de usar e é popular, por exemplo.</p><p>As comunicações que ocorrem pelo <strong>protocolo HTTP</strong> também são conhecidas como ciclo de solicitação-resposta porque é exatamente assim que o protocolo funciona. O <em>client</em> envia uma solicitação ao servidor e o servidor responde ao <em>client</em> em relação a essa solicitação.</p><p>Ao contrário dos humanos, os computadores precisam ser rígidos para se comunicarem uns com os outros ou eles quebram a comunicação. Por esse motivo, um <em>client</em> (computador/dispositivo solicitante) precisa de um conjunto de informações para enviar com a solicitação para que o servidor responda de acordo. Essas informações incluem:</p><ol><li>URL – um endereço da web onde você deseja fazer uma solicitação</li><li>Método – se você deseja dados já armazenados em algum lugar ou deseja salvar novos dados em um banco de dados</li><li>Cabeçalho – todas as informações relevantes sobre sua solicitação, incluindo em qual formato o dispositivo <em>client</em> espera receber os dados</li><li>Corpo – os dados reais da solicitação</li></ol><p>No nosso exemplo do Unsplash, o URL é <a href="https://unsplash.com/s/photos/nature">https://unsplash.com/s/photos/nature</a>. O método é GET, porque queremos que o servidor recupere imagens da natureza. O cabeçalho inclui informações como o formato que nosso computador espera obter e aceitar – como o idioma, o idioma do dispositivo, nosso sistema operacional e assim por diante. O corpo inclui os dados que precisamos enviar ao servidor (a palavra-chave natureza, por exemplo).</p><p>Existem quatro tipos de métodos para solicitações HTTP que abordaremos em breve. Por enquanto, saiba apenas que um método indica o que você deseja fazer com os dados disponíveis no servidor. Por exemplo, se você deseja esses dados como documentos ou se deseja salvar uma nova entrada em dados salvos em algum lugar.</p><p>Quando um <em>client</em> faz uma solicitação, o servidor responde a essa solicitação. A resposta pode ser os dados que o <em>client</em> solicitou ou um erro.</p><p>Assim como uma resposta, uma solicitação tem uma estrutura que inclui URL, código de status, cabeçalho e corpo. Em uma solicitação, temos um método, que possui quatro tipos. Na resposta, temos um código de status, que indica se uma solicitação foi aceita ou recusada.</p><h3 id="m-todos-http">Métodos HTTP</h3><p>Existem quatro métodos HTTP disponíveis e cada um tem sua funcionalidade exclusiva.</p><ol><li>GET: como já discutido, indica que o <em>client</em> está solicitando que os dados sejam enviados do servidor.</li><li>POST: esse método informa ao servidor que o <em>client</em> deseja criar uma entrada em um banco de dados. Por exemplo, salvar uma nova postagem em um blog em um banco de dados de todos os blogs anteriores.</li><li>DELETE: como o nome em inglês sugere, o <em>client</em> deseja excluir um registro de dados de um banco de dados.</li><li>PUT: esse método é usado quando um <em>client</em> deseja atualizar ou editar um registro de dados. Por exemplo, alterar sua senha do Facebook.</li></ol><h3 id="c-digos-de-status-http">Códigos de status HTTP</h3><p>Existe uma lista enorme de códigos de status HTTP, mas vamos dar uma olhada em alguns dos mais comuns:</p><ol><li>200 OK: indica que a solicitação foi atendida com sucesso pelo servidor</li><li>201 CREATED: a entrada de dados cuja criação você solicitou foi criada</li><li>404 NOT FOUND: indica que o recurso que você solicitou não foi encontrado pelo servidor</li><li>500 INTERNAL SERVER ERROR: significa que ocorreu um erro no lado do servidor e que ele não pôde atender à sua solicitação</li></ol><p>Não há necessidade de memorizar esses códigos de status, pois a lista é enorme e você os aprenderá inconscientemente à medida que os encontrar em sua jornada de desenvolvimento.</p><p>Ainda assim, existem vários códigos de status que indicam uma resposta genérica, como você pode ver aqui:</p><ol><li>100s: respostas informativas, indicando o progresso da solicitação</li><li>200s: sucesso, indicando o sucesso da solicitação</li><li>300s: redirecionamento, indicando que a solicitação teve que ser redirecionada para outro lugar</li><li>400s: erros do <em>client</em>, indicando erros que ocorreram no lado do <em>client</em></li><li>500s: erros do servidor, quando o servidor falha ao responder a uma solicitação válida do <em>client</em></li></ol><h2 id="tipos-de-apis">Tipos de APIs</h2><p>Você se lembra quando eu disse que ficava confusa quando as pessoas falavam sobre APIs em diferentes contextos? Isso ocorre porque também temos diferentes tipos de APIs disponíveis.</p><p>As que falamos neste artigo são APIs da web que usam o protocolo HTTP. Os desenvolvedores podem usá-las para criar uma melhor experiência do usuário para seus usuários.</p><p>Outros tipos incluem as APIs internas, que estão ocultas de usuários externos e que são usadas apenas dentro de uma empresa.</p><p>Existem também APIs abertas, que estão disponíveis para serem usadas por qualquer pessoa gratuitamente (como a <a href="https://openweathermap.org/api">OpenWeatherMap API</a>, a API de mapa meteorológico aberto). Você pode ter APIs de parceiros, que são compartilhadas apenas entre parceiros de negócios para realizar suas tarefas de negócios e APIs compostas, que combinam sequencialmente várias solicitações de API em uma única chamada de API para reduzir a carga do servidor e criar uma experiência mais rápida.</p><h3 id="recursos-para-aprender-mais-sobre-apis-">Recursos para aprender mais sobre APIs:</h3><p>Se você quiser aprender mais sobre a criação de APIs, <a href="https://www.freecodecamp.org/news/rest-api-design-best-practices-build-a-rest-api/">aqui há um texto para começar</a> (em inglês).</p><p>Aqui está um tutorial sobre <a href="https://www.freecodecamp.org/news/what-is-an-api-and-how-to-test-it/">tipos de APIs, ferramentas de testes e documentação</a> (em inglês).</p><p>Aqui está uma <a href="https://www.freecodecamp.org/news/fetch-api-cheatsheet/">ficha informativa sobre a Fetch API</a> (em inglês), para você começar a aprender mais sobre ela.</p><h2 id="conclus-o">Conclusão</h2><p>Uma API é uma interface para dois computadores se comunicarem para realizar tarefas na internet.</p><p>As APIs da web seguem o protocolo HTTP para se comunicarem. Esse protocolo possui uma estrutura específica de solicitação e resposta.</p><p>Existem diferentes métodos para realizar diferentes tarefas e vários códigos de status estão disponíveis. Eles indicam se a solicitação foi bem-sucedida, recusada ou está em estado pendente.</p><p>Interessado em se conectar pelo LinkedIn? <a href="https://www.linkedin.com/in/tooba-jamal/">Fale com a autora por lá</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Melhores práticas para APIs REST – Exemplos de criação de endpoints REST ]]>
                </title>
                <description>
                    <![CDATA[ Em desenvolvimento para a web, as APIs REST têm uma função importante na garantia de uma comunicação tranquila entre o client e o servidor. Você pode pensar no client como sendo o front-end e o servidor como o back-end. A comunicação entre o client (front-end) e o servidor (back-end), normalmente, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/melhores-praticas-para-apis-rest-exemplos-de-design-de-endpoints-rest/</link>
                <guid isPermaLink="false">655aa458f2994303ed34461f</guid>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Mon, 20 Nov 2023 01:34:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/api.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">REST API Best Practices – REST Endpoint Design Examples</a>
      </p><p>Em desenvolvimento para a web, as APIs REST têm uma função importante na garantia de uma comunicação tranquila entre o <em>client </em>e o servidor.</p><p>Você pode pensar no <em>client </em>como sendo o <em>front-end</em> e o servidor como o <em>back-end</em>.</p><p>A comunicação entre o <em>client </em>(<em>front-end</em>) e o servidor (<em>back-end</em>), normalmente, não é muito direta. Assim, usamos uma interface, a qual chamamos de Interface de Programação de Aplicações (ou API), que agirá como um intermediário entre o <em>client </em>e o servidor.</p><p>Como a API tem uma função importante nessa comunicação entre o <em>client</em> e o servidor, devemos sempre criar APIs considerando as melhores práticas possíveis. Isso ajuda os desenvolvedores em sua manutenção, bem como em seu consumo, evitando que encontrem problemas ao realizar suas tarefas.</p><p>Neste artigo, mostrarei 9 práticas recomendadas a serem seguidas ao criar APIs REST. Isso ajudará a criar as melhores APIs possíveis e a tornar mais fácil a vida daqueles que consumem suas API.</p><h2 id="primeiramente-o-que-uma-api-rest"><strong>Primeiramente, o que é uma API REST?</strong></h2><p>REST é a abreviação de <em>Representational State Transfer </em>(em português, transferência de estado de representação). É um estilo de arquitetura de software criado por Roy Fielding no ano 2000 que serve para guiar a criação de uma arquitetura para a web.</p><p>Qualquer API (Interface de programação de aplicações) que siga o princípio de criação REST é considerada <strong>RESTful</strong>.</p><p>Colocado de modo simples, uma API REST é um meio para que dois computadores se comuniquem por meio do HTTP (Protocolo de transferência de hipertexto), do mesmo modo que <em>clients </em>e servidores se comunicam.</p><h2 id="melhores-pr-ticas-de-cria-o-de-apis-rest"><strong>Melhores práticas de criação de APIs REST</strong></h2><h3 id="1-use-json-como-o-formato-para-o-envio-e-o-recebimento-de-dados"><strong>1. Use JSON como o formato para o envio e o recebimento de dados</strong></h3><p>No passado, aceitar e responder a solicitações de API era feitos principalmente em XML e até em HTML. Hoje em dia, porém, JSON (<em>JavaScript Object Notation</em>) tornou-se, na maioria das vezes, o formato de fato para enviar e receber dados de API.</p><p>Isso ocorre porque, com o XML, por exemplo, muitas vezes é um pouco complicado decodificar e codificar dados – portanto, o XML não é mais amplamente suportado pelos <em>frameworks</em>.</p><p>O JavaScript, por exemplo, tem um método incorporado para analisar dados em JSON por meio da API de busca (em inglês, <em>Fetch API</em>) porque o JSON foi feito principalmente para ele. Se, contudo, você estiver usando qualquer outra linguagem de programação, como Python ou PHP, agora todas elas também têm métodos para analisar e manipular dados em JSON.</p><p>O Python, por exemplo, fornece os métodos <code>json.loads()</code> e <code>json.dumps()</code> para o trabalho com dados em JSON.</p><p>Para garantir que o <em>client</em> interprete os dados em JSON corretamente, você deve definir o tipo <code>Content-Type</code> no cabeçalho de resposta como <code>application/json</code> ao fazer a solicitação.</p><p>Para <em>frameworks </em>do lado do servidor, por outro lado, muitos deles definem o <code>Content-Type</code> automaticamente. O Express, por exemplo, agora tem o middleware <code>express.json()</code> para essa finalidade. O pacote do NPM chamado <code>body-parser</code> ainda funciona com o mesmo propósito.</p><h3 id="2-use-substantivos-ao-inv-s-de-verbos-nos-endpoints"><strong>2. Use substantivos ao invés de verbos nos <em>endpoints</em></strong></h3><p>Ao criar uma API REST, você não deve usar verbos nos caminhos dos <em>endpoints</em>. Eles devem usar substantivos que representem aquilo que eles fazem.</p><p>Isso ocorre porque os métodos HTTP, como <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code> e <code>DELETE</code>, já usam a forma verbal para realizar operações básicas de CRUD (<em>Create</em>, <em>Read</em>, <em>Update</em> e <em>Delete – </em>em português, criar, ler, atualizar e excluir dados).</p><p><code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>PATCH</code> e <code>DELETE</code> são os verbos mais comuns do HTTP. Existem outros, como <code>COPY</code>, <code>PURGE</code>, <code>LINK</code>, <code>UNLINK</code> e assim por diante.</p><p>Dessa maneira, por exemplo, um <em>endpoint </em>não deve ser assim:</p><p><code>https://meusite.com/getPosts</code> (para obter <em>posts</em>)</p><p>ou assim:</p><p><code>https://meusite.com/createPost</code> (para criar <em>posts</em>)</p><p>Pelo contrário, ele deve ter esta aparência: <code>https://meusite.com/posts</code> (para as publicações em si)</p><p>Resumidamente, deixe que os verbos do HTTP lidem com o que os <em>endpoints</em> fazem. Deixe que <code>GET</code> obtenha os dados, <code>POST</code> os crie, <code>PUT</code> os atualize e <code>DELETE</code> os exclua.</p><h3 id="3-nomeie-cole-es-com-substantivos-no-plural"><strong>3. Nomeie coleções com substantivos no plural</strong></h3><p>Pense nos dados da sua API como se fossem uma coleção de recursos diferentes para aqueles que a consomem.</p><p>Se você tiver um <em>endpoint </em>como <code>https://meusite.com/post/123</code>, pode não haver problema na exclusão de um <em>post</em> com uma solicitação de <code>DELETE</code> ou, ainda, atualizar um <em>post </em>com uma solicitação de <code>PUT</code> ou <code>PATCH</code>, mas isso não informa ao usuário que pode haver outros <em>posts </em>na coleção. É por isso que suas coleções devem usar substantivos no plural.</p><p>Assim, em vez de <code>https://meusite.com/post/123</code>, utilize <code>https://meusite.com/posts/123</code>.</p><h3 id="4-use-c-digos-de-erro-no-tratamento-de-erros"><strong>4. Use códigos de erro no tratamento de erros</strong></h3><p>Você sempre deve usar os códigos de status regulares do HTTP nas respostas às solicitações feitas à API. Isso ajudará os usuários a saberem o que está acontecendo – se a solicitação teve sucesso, se ocorreu um erro ou qualquer outra situação.</p><p>Abaixo, temos uma tabela que mostra diferentes códigos de status do HTTP e seus significados:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">FAIXA DE CÓDIGOS DE STATUS</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">SIGNIFICADO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">100 – 199</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Respostas informativas<br style="box-sizing: inherit;">Por exemplo, 102 indica que o recurso está sendo processado.</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">300 – 399</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Redirecionamentoss<br style="box-sizing: inherit;">Por exemplo, 301 significa que algo foi movido permanentemente.</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">400 – 499</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Erros do lado do client<br style="box-sizing: inherit;">400 significa um problema na solicitação, enquanto 404 significa que o recurso não foi encontrado.</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">500 – 599</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Erros do lado do servidor<br style="box-sizing: inherit;">Por exemplo, 500 representa um erro interno do servidor.</td></tr></tbody></table><!--kg-card-end: html--><h3 id="5-use-aninhamento-nos-endpoints-para-mostrar-as-rela-es"><strong>5. Use aninhamento nos endpoints para mostrar as relações</strong></h3><p>Com frequência, diferentes <em>endpoints </em>podem estar interligados. Por isso, aninhe-os de maneira que seja mais fácil compreender as relações entre eles.</p><p>Como exemplo, no caso de uma plataforma de blog com diversos usuários, <em>posts </em>diferentes podem ser escritos por autores diferentes. Desse modo, um <em>endpoint </em>como <code>https://meusite.com/posts/autor</code> seria um aninhamento válido para o caso em questão.</p><p>Seguindo o mesmo raciocínio, os <em>posts </em>podem ter comentários individuais. Assim, para obter os comentários, um <em>endpoint </em>como <code>https://meusite.com/posts/postId/comentarios</code> faria parte de uma lógica aceitável.</p><p>Evite aninhamentos que tenham mais de três níveis de profundidade, pois isso pode fazer com que a API fique menos elegante e legível.</p><h3 id="6-use-filtragem-ordena-o-e-pagina-o-para-obter-os-dados-solicitados"><strong>6. Use filtragem, ordenação e paginação para obter os dados solicitados</strong></h3><p>Por vezes, o banco de dados de uma API pode ficar incrivelmente grande. Se isso acontecer, obter dados desse banco poderia acabar sendo muito lento.</p><p>Filtragem, ordenação e paginação são ações que podem ser realizadas na coleção de uma API REST. Elas permitem obter, ordenar e organizar os dados necessários em páginas para que o servidor não fique muito ocupado com solicitações.</p><p>Um exemplo de um <em>endpoint </em>com filtragem é o que vemos abaixo:<br><code>https://meusite.com/posts?tags=javascript</code><br>Esse endpoint obterá todos os <em>posts</em> que tiverem a tag <code>JavaScript</code>.</p><h3 id="7-use-ssl-para-ter-mais-seguran-a"><strong>7. Use SSL para ter mais segurança</strong></h3><p>SSL significa <em>secure socket layer </em>(em português, camada de soquete segura). Ela é fundamental para a segurança na criação de uma API REST. Ela garantirá que sua API esteja mais segura e a tornará menos vulnerável a ataques maliciosos.</p><p>Outras medidas de segurança que você deve levar em consideração incluem: tornar a comunicação entre servidor e <em>client</em> privada e garantir que qualquer pessoa que consuma a API não receba mais do que aquilo que solicitou.</p><p>Os certificados de SSL não são difíceis de se carregar em um servidor e estão disponíveis gratuitamente, em grande parte, durante o primeiro ano do site. Nos casos em que não estão disponíveis gratuitamente, eles também não são tão caros.</p><p>A diferença óbvia entre o URL de uma API REST que é executada com SSL daquela que não é executada com ela é a presença de um "s" no HTTP:<br><code>https://meusite.com/posts</code> faz uso de SSL.<br><code>http://meusite.com/posts</code> não faz uso de SSL.</p><h3 id="8-seja-claro-com-o-controle-de-vers-o"><strong>8. Seja claro com o controle de versão</strong></h3><p>APIs REST devem ter versões diferentes, de maneira a não forçar os <em>clients </em>(usuários) a migrar para novas versões. Isso pode até quebrar a aplicação dos usuários se você não for cuidadoso.</p><p>Um dos sistemas de controle de versão mais comuns no desenvolvimento para a web é o de controle de versão semântico.</p><p>Um exemplo de controle de versão semântico é 1.0.0, 2.1.2, e 3.3.4. O primeiro número representa a versão principal (em inglês, <em>major</em>), o segundo representa a versão secundária (em inglês, <em>minor</em>) e o terceiro representa a versão de <em>patch</em>.</p><p>Muitas APIs RESTful dos gigantes da área de tecnologia – e mesmo de indivíduos trabalhando nela – vêm nesse formato:<br><code>https://meusite.com/v1/</code> para a versão 1<br><code>https://mysite.com/v2</code> para a versão 2</p><p>O Facebook faz o controle de versão de suas APIs assim:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/facebook-versioning.jpg" class="kg-image" alt="facebook-versioning" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/facebook-versioning.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/facebook-versioning.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/facebook-versioning.jpg 1280w" sizes="(min-width: 720px) 720px" width="1280" height="764" loading="lazy"></figure><p>O Spotify faz seu controle de versão do mesmo modo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/spotify-versioning.jpg" class="kg-image" alt="spotify-versioning" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/spotify-versioning.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/spotify-versioning.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/spotify-versioning.jpg 1280w" sizes="(min-width: 720px) 720px" width="1280" height="764" loading="lazy"></figure><p>Não é, contudo, o caso para todas as APIs. O Mailchimp, por exemplo, controla as versões de sua API de modo diferente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/mailchimp-ersioning.jpg" class="kg-image" alt="mailchimp-ersioning" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/mailchimp-ersioning.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/mailchimp-ersioning.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/mailchimp-ersioning.jpg 1280w" sizes="(min-width: 720px) 720px" width="1280" height="768" loading="lazy"></figure><p>Ao deixar APIs REST disponíveis desse modo, você não forçará o <em>client</em> a migrar para novas versões caso o usuário decida não fazer isso.</p><h3 id="9-forne-a-uma-documenta-o-de-api-adequada-e-precisa"><strong>9. Forneça uma documentação de API adequada e precisa</strong></h3><p>Ao criar uma API REST, é preciso ajudar os <em>clients</em> (consumidores) a aprender e descobrir como usá-la corretamente. A melhor maneira de se fazer isso é fornecendo uma boa documentação para a API.</p><p>A documentação deve conter:</p><ul><li><em>endpoints </em>relevantes da API</li><li>solicitações de exemplo aos <em>endpoints</em></li><li>implementação em diversas linguagens de programação</li><li>mensagens listadas para os diferentes erros com seus respectivos códigos de status</li></ul><p>Uma das ferramentas mais comuns que você pode usar para a documentação de uma API é o Swagger. Você também pode usar o Postman, uma das ferramentas mais comuns de teste de APIs no desenvolvimento de software, para documentar suas APIs.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Neste artigo, você aprendeu sobre várias práticas recomendadas que você deve ter em mente ao criar suas APIs REST.</p><p>É importante fazer uso dessas práticas recomendadas e convenções para criar aplicações altamente funcionais, que trabalhem bem, sejam seguras e, em última análise, facilitem a vida dos consumidores das APIs.</p><p>Agradeço a leitura. Agora, é a sua vez de criar APIs com essas práticas recomendadas.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Práticas recomendadas para a criação de chaves de API seguras ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Ramesh Lingappa Todos sabemos o valor das APIs. Elas são a porta de entrada para a exploração de outros serviços, para a integração com eles e para a criação de soluções incríveis mais rapidamente. Você já deve ter criado ou está pensando em criar APIs para que outros ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/praticas-recomendadas-para-a-criacao-de-chaves-de-api-seguras/</link>
                <guid isPermaLink="false">653714b31ea87503e8fba3c5</guid>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Tue, 24 Oct 2023 02:04:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_-QHPiNtOHuhuD2B7SqMLPw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/best-practices-for-building-api-keys-97c26eabfea9/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Best practices for building secure API Keys</a>
      </p><p>Escrito por: Ramesh Lingappa</p><p>Todos sabemos o valor das APIs. Elas são a porta de entrada para a exploração de outros serviços, para a integração com eles e para a criação de soluções incríveis mais rapidamente.</p><p>Você já deve ter criado ou está pensando em criar APIs para que outros desenvolvedores as utilizem. Uma API precisa de alguma forma de autenticação para dar acesso autorizado aos dados que ela retorna.</p><p>Existem vários padrões de autenticação disponíveis hoje em dia, como chaves de API, <a href="https://oauth.net/2/" rel="noopener">OAuth</a>, <a href="https://jwt.io/" rel="noopener">JWT</a>, entre outros.</p><p>Neste artigo, veremos como gerenciar corretamente as chaves para acessar APIs.</p><h4 id="por-que-usar-chaves-de-api"><strong>Por que usar chaves de API?</strong></h4><p>As chaves de API são simples de usar, são breves, estáticas e não expiram até terem sido revogadas. Elas fornecem uma maneira fácil para que diversos serviços se comuniquem.</p><p>Se você fornecer uma API para que seus clientes a consumam, é essencial que você crie as chaves de API do modo certo.</p><p>Vamos começar. Quero mostrar a vocês como criar chaves de API corretamente.</p><h3 id="gera-o-de-chaves-de-api"><strong>Geração de chaves de API</strong></h3><p>Como a própria chave de API é uma identidade a partir da qual reconheceremos a aplicação ou o usuário, ela precisa ser exclusiva, aleatória e não ser fácil de adivinhar. Chaves de API geradas também devem usar caracteres alfanuméricos e especiais. Um exemplo de chave de API seria <code>zaCELgL.0imfnc8mVLWwsAawjYr4Rx-Af50DDqtlx</code>.</p><h3 id="armazenamento-seguro-de-chaves-de-api"><strong>Armazenamento seguro de chaves de API</strong></h3><p>Como a chave da API fornece acesso direto aos dados, ela é semelhante a uma senha que o usuário da web ou da aplicação para dispositivos móveis fornece para obter acesso aos mesmos dados.</p><p>Pense nisto: o motivo pelo qual precisamos armazenar chaves de API é garantir que a chave da API que se encontra na requisição seja válida e emitida por nós mesmos (como uma senha).</p><p>Não precisamos conhecer a chave de API bruta. Precisamos apenas validar se a chave está correta. Assim, em vez de armazenar a chave em texto simples (o que é ruim) ou criptografá-la, devemos armazená-la como um valor com um <em>hash</em> em nosso banco de dados.</p><p>Um valor com <em>hash </em>significa que, mesmo que alguém obtivesse acesso não autorizado ao nosso banco de dados, as chaves de API não seriam "vazadas" e tudo continuaria seguro. O usuário final poderia enviar a chave de API bruta em toda solicitação à API e poderíamos validar a chave passando-a pelo <em>hash </em>na solicitação e comparando a chave com <em>hash </em>com a chave com <em>hash </em>armazenada em nosso banco de dados. O problema está no fato de que armazenar um valor com <em>hash </em>pode trazer problemas específicos de usabilidade. Falaremos deles agora.</p><h3 id="como-apresentar-as-chaves-de-api-aos-usu-rios"><strong>Como apresentar as chaves de API aos usuários</strong></h3><p>Como não armazenamos a chave de API original, podemos mostrá-la apenas uma vez para o usuário, no momento de sua criação. Desse modo, não se esqueça de alertar os usuários de que ela não poderá ser obtida novamente, sendo preciso gerar um novo <em>token </em>caso eles tenham se esquecido de copiar a chave de API e de armazená-la de modo seguro. Você pode fazer algo assim:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_DutIyYh2hE-YAkirxtoIxg.png" class="kg-image" alt="1_DutIyYh2hE-YAkirxtoIxg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/1_DutIyYh2hE-YAkirxtoIxg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_DutIyYh2hE-YAkirxtoIxg.png 610w" width="600" height="400" loading="lazy"><figcaption>Mostrando a chave de API gerada com uma mensagem de alerta</figcaption></figure><h4 id="como-os-usu-rios-podem-identificar-posteriormente-uma-chave-de-api-gerada"><strong>Como os usuários podem identificar</strong><strong> posteriormente</strong><strong> uma chave de API gerada</strong></h4><p>Outro problema está em como os usuários identificam a chave de API certa em nosso console se precisarem editá-la ou revogá-la. Isso pode ser resolvido adicionando um prefixo à chave de API. Perceba na figura acima <strong>os </strong><strong>primeiros<strong> 7 caracter</strong>e<strong>s (</strong>nosso prefixo<strong>), </strong></strong>separados do resto da chave de API pelo ponto.</p><p>Agora, você pode armazenar este prefixo no banco de dados e exibi-lo no console para que os usuários possam identificar rapidamente a entrada certa da chave de API, assim:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_WU0mFXXFXW2VlA9BXK3ffA.png" class="kg-image" alt="1_WU0mFXXFXW2VlA9BXK3ffA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/1_WU0mFXXFXW2VlA9BXK3ffA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_WU0mFXXFXW2VlA9BXK3ffA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Console de gerenciamento das chaves de API</figcaption></figure><h3 id="n-o-d-todo-o-poder-chave-de-api"><strong>Não dê todo o poder à chave de API</strong></h3><p>Um erro comum que cometem os fornecedores de chaves de API é o de dar a <strong>uma única chave acesso a tudo</strong>, já que isso facilita o gerenciamento. Não faça isso. Leve em conta que um usuário precisa apenas ler um e-mail para gerar uma chave de API. Essa chave, porém, agora terá acesso total aos outros serviços, incluindo a permissão de exclusão de registros no banco de dados.</p><p>A abordagem <strong>correta</strong> seria a de permitir aos usuários finais terem acesso a chaves de API restritas e selecionar ações específicas que essas chaves possam realizar. Isso pode ser feito por meio do fornecimento de <strong>es<strong>cop</strong>o<strong>s</strong></strong>, onde cada escopo representa uma permissão específica.</p><p>Por exemplo:</p><ul><li>se você precisa de uma chave de API apenas para enviar e-mails, pode gerar uma chave de API com o escopo sendo algo como <strong>"<strong>email.</strong>envios"</strong></li><li>se o usuário final tiver diversos servidores e cada um deles realizar uma ação específica, uma chave de API separada pode ser gerada para cada escopo específico.</li></ul><p>Assim, ao criar uma chave de API, permita que os usuários selecionem qual o acesso à chave de API deve ter, assim como na imagem abaixo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_-HHZ-Vfwz9FBPl-FIlS6mg.png" class="kg-image" alt="1_-HHZ-Vfwz9FBPl-FIlS6mg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_-HHZ-Vfwz9FBPl-FIlS6mg.png 600w" width="600" height="400" loading="lazy"></figure><p>Desse modo, os usuários podem gerar diversas chaves de API, cada uma com regras específicas de acesso, gerando uma maior segurança. Quando uma requisição de API for recebida, será possível verificar se a chave de API tem o escopo certo para acessar aquela API. O banco de dados, agora, teria uma aparência semelhante a esta:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_y9SVyRJa3m50tQ0buEU1VA.png" class="kg-image" alt="1_y9SVyRJa3m50tQ0buEU1VA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/1_y9SVyRJa3m50tQ0buEU1VA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/1_y9SVyRJa3m50tQ0buEU1VA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Entidade do banco de dados de chaves de API</figcaption></figure><h3 id="chaves-de-api-com-limita-o-de-taxa"><strong>Chaves de API com limitação de taxa</strong></h3><p>Sim, talvez você já saiba disso, mas é importante limitar a taxa de solicitações feitas com chaves de API específicas para garantir que ninguém mal-intencionado possa derrubar seus servidores de APIs ou causar problemas de desempenho que possam afetar outros usuários. Ter uma limitação de taxa adequada e monitorar soluções mantém o serviço da API em bom estado.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Chaves de API, quando criadas do modo certo, seguem sendo uma grande maneira de se comunicar com outro servidor. Como revisamos neste artigo, seguir certas práticas oferece benefícios tanto aos fornecedores quanto aos consumidores das APIs. Espero que o artigo tenha ajudado você.</p><p>Divirta-se deixando suas APIs cada vez mais seguras!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como versionar uma API REST ]]>
                </title>
                <description>
                    <![CDATA[ Se você não está muito familiarizado com APIs, pode estar se perguntando... por que tanta conversa sobre o versionamento de API? Se você já teve de fazer alterações na API, provavelmente é você quem está se conversando sobre o assunto. Se você mantém uma API, também pode estar tentando responder ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-versionar-uma-api-rest/</link>
                <guid isPermaLink="false">64c6cdd0529f3305560af8eb</guid>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Mon, 31 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Art-Exhibit-Blog-Banner.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-version-a-rest-api/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Version a REST API</a>
      </p><p>Se você não está muito familiarizado com APIs, pode estar se perguntando... por que tanta conversa sobre o versionamento de API?</p><p>Se você já teve de fazer alterações na API, provavelmente é você quem está se conversando sobre o assunto. Se você mantém uma API, também pode estar tentando responder a perguntas desafiadoras como estas:</p><pre><code># Esta é a versão 2 apenas de 'produtos' ou da API inteira?
/v2/produtos

# O que gerou a mudança de v1 para v2? Qual é a diferença entre elas?
/v1/produtos
/v2/produtos</code></pre><p>Essas perguntas sobre versionamento não são fáceis de responder. Nem sempre está claro a que <code>v1</code> ou <code>v2</code> se referem. Não devemos simplesmente fazer uma segunda versão de um <em>endpoint</em> quando a primeira já não parece ser suficiente.</p><p>Há razões claras pelas quais sua API <em>precisa </em>ter versionamento. Também existem estratégias claras sobre <em>como </em>navegar efetivamente pelas alterações da API.</p><p>No entanto, descobri que a maioria dos desenvolvedores – incluindo eu mesmo até ter aprendido algumas lições da maneira mais difícil – não está ciente dessas razões e estratégias.</p><p>Este artigo procura mostrar as razões para o versionamento e as estratégias para realizá-lo. Vamos assumir um contexto de API <a href="https://restfulapi.net/">REST</a> – pois é um padrão para muitas APIs – e nos concentrar no aspecto do versionamento.</p><h2 id="o-que-o-versionamento"><strong>O que é o versionamento?</strong></h2><p>Devemos começar com a definição de nível sobre o que significa o termo "versionamento de API". Aqui está a nossa definição de trabalho:</p><blockquote>O versionamento de APIs é a prática de gerenciar de maneira transparente as alterações em sua API.</blockquote><p>O versionamento é uma comunicação eficaz em torno de alterações em sua API, para que quem as consome saiba o que esperar dela. Você está entregando dados para o público de algum modo e precisa comunicar quando muda a maneira como os dados são entregues.</p><p>O resumo disso é que, no mínimo, é preciso gerenciar contratos de dados e quebrar mudanças. O primeiro é o bloco de construção principal da sua API e o segundo revela o motivo de o versionamento ser necessário.</p><h3 id="contratos-de-dados">Contratos de dados</h3><p>Uma API é uma Interface de Programação de Aplicações. Uma interface é um limite compartilhado para a troca de informações. O contrato de dados é o coração dessa interface.</p><blockquote>Um contrato de dados é um acordo sobre o modo e o conteúdo geral dos dados de solicitação e/ou resposta.</blockquote><p>Para ilustrar um contrato de dados, aqui está um corpo de resposta JSON básico:</p><pre><code class="language-json">{
  "dados": [
    {
      "id": 1,
      "nome": "Produto 1"
    },
    {
      "id": 2,
      "nome": "Produto 2"
    }
  ]
}</code></pre><p>O JSON é um objeto com uma propriedade <code>dados</code>, que é um <em>array </em>(lista) de produtos, cada um desses produtos com uma propriedade <code>id</code> e uma propriedade <code>nome</code>. A propriedade <code>dados</code>, porém, também poderia ter sido facilmente chamada de <code>body</code>. A propriedade <code>id</code> de cada produto, por sua vez, poderia ter sido um GUID em vez de um número inteiro. Se um único produto estivesse sendo retornado, <code>dados</code> poderia ser um objeto em vez de um array.</p><p>Essas mudanças aparentemente sutis teriam criado um acordo diferente, um contrato diferente, em relação ao "formato" no qual os dados são apresentados. O formato dos dados pode ser aplicado a nomes de propriedades, tipos de dados ou até mesmo ao formato esperado (JSON ou XML).</p><h3 id="por-que-o-versionamento-necess-rio">Por que o versionamento é necessário?</h3><p>Com as APIs, algo tão simples como alterar o nome de uma propriedade de <code>IdDoProduto</code> para <code>IDDoProduto</code> pode causar problemas para quem consome a API. Isso foi exatamente o que aconteceu com a nossa equipe na semana passada.</p><p>Felizmente, fizemos testes para detectar alterações no contrato da API. No entanto, não deveríamos ter precisado desses testes, porque os mantenedores da API deveriam saber que essa seria uma mudança que causaria problemas.</p><h3 id="mudan-as-problem-ticas">Mudanças problemáticas</h3><p>Essa foi uma mudança problemática no contrato de dados acordado, pois a mudança deles nos obrigou a também mudar nossa aplicação.</p><p>O que constitui uma "mudança problemática" em um <em>endpoint</em> de API?</p><p>As alterações de quebra se encaixam principalmente nas seguintes categorias:</p><ol><li>Alterar o formato de solicitação/resposta (por exemplo, de XML para JSON)</li><li>Alterar um nome de propriedade (por exemplo, de <code>nome</code> para <code>nomeDoProduto</code>) ou tipo de dados em uma propriedade (por exemplo, de número inteiro para número de ponto flutuante)</li><li>Adicionar um campo obrigatório na solicitação (por exemplo, um novo cabeçalho ou propriedade obrigatório em um corpo de solicitação)</li><li>Remover uma propriedade na resposta (por exemplo, remover a <code>descricao</code> de um produto)</li></ol><h3 id="gerenciamento-de-altera-es-da-api">Gerenciamento de alterações da API</h3><p>Nunca é sábio ou gentil forçar os consumidores de uma API a fazer uma mudança. Se você precisar fazer uma alteração problemática, use o versionamento para isso. Abordaremos as maneiras mais eficazes de fazer a versão da sua aplicação e dos <em>endpoints</em>.</p><p>Primeiramente, vamos discutir brevemente como evitar mudanças problemáticas. Poderíamos chamar isso de gerenciamento de alterações da API.</p><p>O gerenciamento eficaz de alterações no contexto de uma API é resumido pelos seguintes princípios:</p><ul><li>Manter o suporte a propriedades/<em>endpoints</em> existentes</li><li>Adicionar novas propriedades/<em>endpoints</em> em vez de alterar os existentes</li><li>Tornar obsoletos propriedades/<em>endpoints</em> com muito cuidado</li></ul><p>Aqui está um exemplo que demonstra todos esses três princípios no contexto da resposta para solicitar dados do usuário:</p><pre><code class="language-json">{
  "dados": {
    "id": 1,
    "nome": "Carlos Ray Norris",       // propriedade original
    "nomeInicial": "Carlos",           // propriedade nova
    "sobreNome": "Norris",             // propriedade nova
    "apelido": "Chuck",                // propriedade obsoleta
    "apelidos": ["Chuck", "Walker"]   // propriedade nova
  },
  "meta": {
    "notasDosCampos": [
      {
        "campo": "apelido",
        "nota": "Será tornado obsoleto em [data futura]. Utilize apelidos em seu lugar."
      }
    ]
  }
}</code></pre><p>Nesse exemplo, <code>nome</code> era uma propriedade original. Os campos <code>nomeInicial</code> e <code>sobrenome</code> estão sendo implementados para fornecer uma opção mais granular, caso quem consuma a API queira exibir "Sr. Norris" com alguma interpolação de <em>strings</em>, mas sem ter que analisar o campo <code>nome</code>. No entanto, a propriedade <code>nome</code> continuará a ser suportada.</p><p><code>apelido</code>, por outro lado, será preterido em favor do array <code>apelidos</code> – já que Chuck tem muitos apelidos – há uma nota na resposta para indicar o tempo até que o campo se torne obsoleto.</p><h3 id="como-fazer-a-vers-o-de-uma-api">Como fazer a versão de uma API?</h3><p>Esses princípios farão uma grande diferença na navegação pelas alterações em sua API sem a necessidade de lançar uma nova versão. No entanto (e, às vezes, isso é inevitável), se você precisar de um novo contrato de dados, precisará de uma nova versão do seu <em>endpoint</em>. Então, você precisará comunicar isso ao público de alguma maneira.</p><p>Como um aparte, observe que não estamos falando sobre a versão da base de código subjacente. Portanto, se você estiver usando o <a href="https://semver.org/">versionamento semântico</a> (link em inglês) para sua aplicação que também oferece suporte a uma API pública, provavelmente desejará separar esses sistemas de versionamento.</p><p>Como criar uma outra versão da sua API? Quais são os diferentes métodos para fazê-lo? Você precisará determinar que tipo de estratégia de versionamento deseja adotar em geral e, à medida que desenvolve e mantém sua API, precisará determinar o escopo de cada alteração de versão.</p><h3 id="escopo">Escopo</h3><p>Vamos abordar o escopo primeiro. Como exploramos acima, às vezes, os contratos de dados serão comprometidos por uma alteração problemática. Isso significa que precisaremos fornecer uma nova versão do contrato de dados. Isso pode representar uma nova versão de um <em>endpoint</em> ou uma alteração em um escopo mais global da aplicação.</p><p>Podemos pensar em níveis de mudança de escopo dentro de uma analogia de árvore:</p><ul><li><strong>Folha </strong>– uma alteração em um <em>endpoint</em> isolado, sem relação com outros <em>endpoints</em></li><li><strong>Galho</strong> – uma alteração em um grupo de <em>endpoints</em> ou em um recurso acessado por vários <em>endpoints</em></li><li><strong>Tronco </strong>– uma alteração no nível da aplicação, causando uma alteração de versão na maioria ou em todos <em>endpoints</em></li><li><strong>Raiz </strong>– uma alteração que afeta o acesso a todos os recursos da API de todas as versões</li></ul><p>Como você pode ver, passando da folha até a raiz, as mudanças se tornam progressivamente mais impactantes e de alcance global.</p><p>O escopo de <em>folha </em>geralmente pode ser manipulado por meio do gerenciamento eficaz de alterações de API. Caso contrário, basta criar um outro <em>endpoint </em>com o novo contrato de dados de recursos.</p><p>Um <em>galho</em> é um pouco mais complicado, dependendo de quantos <em>endpoints</em> são afetados pela alteração do contrato de dados no recurso em questão. Se as alterações estiverem relativamente confinadas a um grupo claro de <em>endpoints</em> relacionados, você poderá navegar por isso introduzindo um novo nome para o recurso e atualizando seus documentos de acordo.</p><pre><code># variantes, que possui uma mudança problemática, é acessada por diversas rotas
/variantes
/produtos/:id/variantes

# apresentamos variantes-do-produto em seu lugar
/variantes-do-produto
/produtos/:id/variantes-do-produto</code></pre><p>Um <em>tronco </em>refere-se a alterações no nível da aplicação que, geralmente, são resultado de uma alteração em uma das seguintes categorias:</p><ul><li>Formato (por exemplo, de XML para JSON)</li><li>Especificação (por exemplo, de uma especificação interna para uma da <a href="https://jsonapi.org">JSON API</a> ou da <a href="https://www.openapis.org/">Open API</a>)</li><li>Cabeçalhos necessários (por exemplo, para autenticação/autorização)</li></ul><p>Essas categorias exigirão uma alteração na versão geral da API. Portanto, você deve planejar cuidadosamente e executar bem a transição.</p><p>Uma alteração de raiz forçará você a dar um passo adiante para garantir que todos os consumidores de todas as versões de sua API estejam cientes da alteração.</p><h3 id="tipos-de-versionamento-de-api">Tipos de versionamento de API</h3><p>À medida que nos voltamos para diferentes tipos de versionamento de API, desejaremos usar esses insights em escopos variados de alterações de API para avaliar os tipos. Cada abordagem tem seu próprio conjunto de pontos fortes e fracos para lidar com as mudanças com base em seu escopo.</p><p>Existem vários métodos para gerenciar a versão da API. O versionamento do caminho do URI (<em>Uniform Resource Identifier</em>, ou, em português, identificador uniforme de recurso) é o mais comum.</p><h3 id="caminho-do-uri">Caminho do URI</h3><pre><code>http://www.exemplo.com/api/v1/produtos
http://api.exemplo.com/v1/produtos</code></pre><p>Essa estratégia envolve colocar o número da versão no caminho do URI e geralmente é feita com o prefixo "v". Na maioria das vezes, os criadores de APIs o usam para se referir à versão da aplicação (ou seja, o "<em>tronco</em>") em vez de a versão do <em>endpoint</em> (ou seja, da "<em>folha</em>" ou do "<em>galho</em>"), mas essa nem sempre é uma suposição segura.</p><p>O versionamento do caminho de URI implica versões orquestradas de versões de aplicação que exigirão uma de duas abordagens: manter uma versão enquanto desenvolve uma nova ou forçar os consumidores a esperar por novos recursos até que a nova versão seja lançada. Isso também significa que você precisaria transferir quaisquer <em>endpoints</em> não alterados de versão para versão. No entanto, para APIs com volatilidade relativamente baixa, ainda é uma opção decente.</p><p>Você, provavelmente, não gostaria de relacionar seu número de versão com o do <em>endpoint</em> ou recurso, pois isso resultaria facilmente em algo como uma v4 de produtos, mas uma v1 de variantes, o que seria bastante confuso.</p><h3 id="par-metros-de-consulta">Parâmetros de consulta</h3><pre><code>http://www.exemplo.com/api/produtos?versao=1</code></pre><p>Esse tipo de versionamento adiciona um parâmetro de consulta (do inglês, <em>query</em>) à solicitação que indica a versão. Muito flexível em termos de solicitação da versão do recurso que você gostaria no nível de "<em>folha</em>", mas não tem noção da versão geral da API e se presta aos mesmos problemas de assincronia mencionados no comentário acima sobre o versionamento em nível de <em>endpoint</em> do caminho do URI.</p><h3 id="cabe-alho">Cabeçalho</h3><pre><code>Accept: versao=1.0</code></pre><p>A abordagem de cabeçalho é aquela que fornece mais granularidade no fornecimento da versão solicitada de qualquer recurso específico.</p><p>No entanto, ela fica oculta dentro do objeto de solicitação e não é tão transparente quanto a opção do caminho do URI. Também é difícil dizer se 1.0 se refere à versão do <em>endpoint </em>ou da própria API.</p><h3 id="integra-o-de-tipos">Integração de tipos</h3><p>Cada uma dessas abordagens parece ter a fraqueza de favorecer um escopo de "<em>folha</em>" ou de "<em>tronco</em>", mas sem dar suporte ao outro tipo.</p><p>Se você precisar manter a versão geral da API e, ao mesmo tempo, fornecer suporte para várias versões de recursos, considere uma combinação dos tipos de caminho do URI e parâmetros de consulta ou, ainda, uma abordagem de cabeçalho mais avançada.</p><pre><code># Combinação de caminho da URIe parâmetros de consulta
http://api.exemplo.com/v1/produtos?versao=1
http://api.exemplo.com/v1/produtos?versao=2

# Cabeçalhos estendidos, para http://api.exemplo.com/produtos
Accept: versao-da-api=1; versao-do-recurso=1
Accept: versao-da-api=1; versao-do-recurso=2</code></pre><h3 id="conclus-o">Conclusão</h3><p>Tratamos de muitas coisas aqui. É hora de recapitular:</p><ul><li>O versionamento da API é a prática de gerenciar de modo transparente as alterações em sua API.</li><li>O gerenciamento de uma API se resume a definir e evoluir contratos de dados e lidar com alterações problemáticas.</li><li>A maneira mais eficaz de evoluir sua API sem interromper as alterações é seguir princípios eficazes de gerenciamento de alterações de API.</li><li>Para a maioria das APIs, o versionamento do caminho do URI é a solução mais simples.</li><li>Para APIs mais complexas ou voláteis, você pode gerenciar escopos variados de alterações empregando uma combinação das abordagens de caminho do URI e de parâmetros de consulta.</li></ul><p>Embora esses princípios devam fornecer uma direção clara sobre como gerenciar efetivamente as alterações em suas APIs, evoluir uma API é, potencialmente, mais uma arte do que uma ciência. São necessárias reflexão e previsão para criar e manter uma API confiável.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como fazer uma chamada de API no Swift ]]>
                </title>
                <description>
                    <![CDATA[ Se você deseja se tornar um desenvolvedor iOS, existem algumas habilidades fundamentais que vale a pena conhecer. Em primeiro lugar, é importante estar familiarizado com a criação de visualizações de tabela. Em segundo, você deve saber como preencher essas visualizações de tabela com dados. Em terceiro, é ótimo se você ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-fazer-uma-chamada-de-api-no-swift/</link>
                <guid isPermaLink="false">63165480281b1606c8fcd06d</guid>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Paula Flávia Pagotto Simionato ]]>
                </dc:creator>
                <pubDate>Sun, 25 Sep 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/09/5f9c9ef3740569d1a4ca4004.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-make-your-first-api-call-in-swift/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to make an API call in Swift</a>
      </p><p>Se você deseja se tornar um desenvolvedor iOS, existem algumas habilidades fundamentais que vale a pena conhecer. Em primeiro lugar, é importante estar familiarizado com a criação de visualizações de tabela. Em segundo, você deve saber como preencher essas visualizações de tabela com dados. Em terceiro, é ótimo se você puder buscar dados de uma API e usar esses dados em sua visualização de tabela.</p><p>O terceiro ponto é o que abordaremos neste artigo. Desde a introdução do <code>Codable</code> no Swift 4, fazer chamadas de API ficou muito mais fácil. Anteriormente, a maioria das pessoas usava pods como Alamofire e SwiftyJson (você pode ler sobre como fazer isso <a href="https://code.likeagirl.io/3-steps-to-make-your-first-api-call-836e43ed702c">aqui</a> - texto em inglês). Agora, o Swift está muito melhor desde o início. Assim, não há motivo para baixar um pod.</p><p>Vamos passar por alguns blocos de construção que são frequentemente usados para fazer uma chamada de API. Abordaremos esses conceitos primeiro, pois eles são partes importantes para entender como fazer uma chamada de API.</p><ul><li>Manipuladores de conclusão (em inglês, <em>Completion handlers</em>)</li><li><code>URLSession</code></li><li><code>DispatchQueue</code></li><li>Ciclos de retenção</li></ul><p>Por fim, vamos juntar isso tudo. Usaremos a <a href="https://www.swapi.co/">API de Star Wars</a> de código aberto para construir esse projeto. Você pode ver o código completo do meu projeto no <a href="https://github.com/ailyntang/starwars/">GitHub</a>.</p><p><em>Alerta de isenção de responsabilidade: sou nova na programação e sou autodidata. Peço desculpas se deturpei alguns conceitos.</em></p><h2 id="manipuladores-de-conclus-o">Manipuladores de conclusão</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/09/pheobe.jpeg" class="kg-image" alt="pheobe" width="299" height="168" loading="lazy"><figcaption>Pobre e paciente Phoebe</figcaption></figure><p>Lembra do episódio de Friends em que a Phoebe fica grudada no telefone por dias esperando para falar com o atendimento ao cliente? Imagine se, bem no início dessa ligação, uma pessoa adorável chamada Pip dissesse: "Obrigado por ligar. Não tenho ideia de quanto tempo você precisará esperar, mas ligo de volta quando estivermos prontos para você." Não teria sido tão engraçado, mas Pip estaria se oferecendo para ser um manipulador de conclusão para Phoebe.</p><p>Você usa um manipulador de conclusão em uma função quando sabe que essa função demorará um pouco para ser concluída. Você não sabe quanto tempo e não quer pausar sua vida esperando que ela termine. Então, você pede a Pip para dar um toque a você quando ela estiver pronta para dar uma resposta. Desse modo, você pode seguir sua vida, sair para comprar coisas, ler um livro e assistir TV. Quando Pip avisar você que já tem a resposta, você pode pegá-la e usá-la.</p><p>Isso é o que acontece com as chamadas de API. Você envia uma solicitação de URL para um servidor, solicitando alguns dados. Você espera que o servidor retorne os dados rapidamente, mas não sabe quanto tempo levará. Em vez de fazer seu usuário esperar pacientemente até que o servidor forneça os dados, você usa um manipulador de conclusão. Isso significa que você pode dizer ao seu aplicativo para desligar e fazer outras coisas, como carregar o resto da página.</p><p>Você diz ao manipulador de conclusão para avisar o seu aplicativo assim que ele tiver as informações desejadas. Você pode especificar quais são essas informações. Desse modo, quando seu aplicativo é avisado, ele pode pegar as informações do manipulador de conclusão e fazer algo com elas. Normalmente, o que você fará é recarregar a visualização da tabela para que os dados apareçam para o usuário.</p><p>Aqui está um exemplo da aparência de um manipulador de conclusão. O primeiro exemplo é de quando configuramos a própria chamada da API:</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">func fetchFilms(completionHandler: @escaping ([Film]) -&gt; Void) {
  // Configurar a variável lotsOfFilms
  var lotsOfFilms: [Film]
  
  // Chamar a API com algum código
  
  // Usar os dados da API, atribuir um valor a lotsOfFilms  
  
  // Dar ao manipulador de conclusão a variável lotsOfFilms
  completionHandler(lotsOfFilms)
}</code></pre><figcaption>A function that uses a completion handler</figcaption></figure><p>Agora, podemos invocar a função <code>fetchFilms</code>. Algumas coisas a serem observadas:</p><ul><li>Você não precisa referenciar o <code>completionHandler</code> quando você chama a função. A única vez em que você faz referência ao <code>completionHandler</code> está dentro da declaração da função.</li><li>O manipulador de conclusão nos devolverá alguns dados para usar. Com base na função que escrevemos acima, sabemos esperar dados do tipo <code>[Film]</code>. Precisamos nomear os dados para que possamos nos referir a eles. Abaixo, estou usando o nome <code>films</code>, mas poderia ser <code>randomData</code>, ou qualquer outro nome de variável.</li></ul><p>O código ficará mais ou menos assim:</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">fetchFilms() { (films) in
  // Fazer algo com os dados retornados pelo manipulador de conclusão 
  print(films)
}</code></pre><figcaption>Implementing a function with a completion handler</figcaption></figure><h2 id="urlsession"><strong><strong>URLSession</strong></strong></h2><p><code>URLSession</code> é como o gerente de uma equipe. O gerente não faz nada sozinho. Seu trabalho é compartilhar o trabalho com as pessoas de sua equipe, e eles farão o trabalho. A equipe dela são as <code>dataTasks</code>. Toda vez que você precisar de alguns dados, escreva para o chefe e use <code>URLSession.shared.dataTask</code>.</p><p>Você pode dar ao <code>dataTask</code> diferentes tipos de informações para ajudá-lo a atingir seu objetivo. Dar informações ao <code>dataTask</code> é chamado de inicialização. Eu inicializo meu <code>dataTasks</code> com URLs. As <code>dataTasks</code> também usam manipuladores de conclusão como parte de sua inicialização. Aqui está um exemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">let url = URL(string: "https://www.swapi.co/api/films")

let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in 
  // Insira seu código aqui
})

task.resume()</code></pre><figcaption>How to use URLSession to fetch some data</figcaption></figure><p>As <code>dataTasks</code> usam manipuladores de conclusão e sempre retornam os mesmos tipos de informações: <code>data</code>, <code>response</code> e <code>error</code>. Você pode dar nomes diferentes a esses tipos de dados, como<code>(data, res, err)</code> ou <code>(someData, someResponse, someError)</code>. Por uma questão de convenção, é melhor se ater a algo óbvio em vez de usar novos nomes de variáveis.</p><p>Vamos começar com <code>error</code>. Se <code>dataTask</code> retorna um <code>error</code>, você vai querer saber isso antecipadamente. Isso significa que você pode direcionar seu código para lidar com o erro normalmente. Isso também significa que você não se incomodará em tentar ler os dados e fazer algo com eles, pois há um erro ao retornar os dados.</p><p>Abaixo, estou lidando com o erro simplesmente imprimindo um erro no console e saindo da função. Existem muitas outras maneiras de lidar com o erro, se desejar. Pense em como esses dados são fundamentais para seu aplicativo. Por exemplo, se você tiver um aplicativo bancário e essa chamada de API mostrar o saldo dos usuários, convém lidar com o erro apresentando um modal ao usuário que diz: "Desculpe, estamos enfrentando um problema agora. Tente de novo mais tarde."</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">if let error = error {
  print("Error accessing swapi.co: /(error)")
  return
}</code></pre><figcaption>Tratamento do erro</figcaption></figure><p> Em seguida, analisamos a resposta. Você pode converter a resposta para que seja um <code>httpResponse</code>. Desse modo, você pode ver os códigos de status e tomar algumas decisões com base no código. Por exemplo, se o código de status for 404, você saberá que a página não foi encontrada.</p><p>O código abaixo usa <code>guard</code> para verificar se existem duas coisas. Se ambos existirem, ele permitirá que o código continue para a próxima instrução após a cláusula de <code>guard</code>. Se qualquer uma das instruções falhar, saímos da função. Este é um caso de uso típico de uma cláusula de <code>guard</code>. Você espera que o código após uma cláusula de <code>guard</code> seja o fluxo ideal (ou seja, o fluxo fácil sem erros).</p><pre><code class="language-swift">  guard let httpResponse = response as? HTTPURLResponse,
            (200...299).contains(httpResponse.statusCode) else {
    print("Erro na resposta. Código de status esperado: \(response)")
    return
  }</code></pre><p>Finalmente, você lida com os dados em si. Observe que não usamos o manipulador de conclusão para <code>error</code> ou para <code>response</code>. Isso ocorre porque o manipulador de conclusão está aguardando dados da API. Se não chegar à parte de dados do código, não há necessidade de invocar o manipulador.</p><p>Estamos usando o <code>JSONDecoder</code> para analisar os dados de uma maneira agradável. Isso é muito bom, mas requer que você tenha estabelecido um modelo. Nosso modelo é chamado <code>FilmSummary</code>. Se o <code>JSONDecoder</code> for novo para você, dê uma olhada on-line para saber como usá-lo e como usar o <code>Codable</code>. É muito simples no Swift 4 e em versões superiores em comparação com a época do Swift 3.</p><p>No código abaixo, primeiro verificamos se os dados existem. Temos certeza de que deve existir, porque não há erros nem respostas HTTP estranhas. Em segundo lugar, verificamos se podemos analisar os dados que recebemos da maneira que esperamos. Se pudermos, devolvemos o resumo do filme ao manipulador de conclusão. Caso não haja dados para retornar da API, temos um plano de retorno (em inglês, <em>fall back</em>) do array vazio.</p><pre><code class="language-swift">if let data = data,
        let filmSummary = try? JSONDecoder().decode(FilmSummary.self, from: data) {
        completionHandler(filmSummary.results ?? [])
      }</code></pre><p>Portanto, o código completo para a chamada da API fica assim:</p><pre><code class="language-swift">func fetchFilms(completionHandler: @escaping ([Film]) -&gt; Void) {
    let url = URL(string: domainUrlString + "films/")!

    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
      if let error = error {
        print("Erro ao obter os filmes: \(error)")
        return
      }
      
      guard let httpResponse = response as? HTTPURLResponse,
            (200...299).contains(httpResponse.statusCode) else {
        print("Erro na resposta. Código de status esperado: \(response)")
        return
      }

      if let data = data,
        let filmSummary = try? JSONDecoder().decode(FilmSummary.self, from: data) {
        completionHandler(filmSummary.results ?? [])
      }
    })
    task.resume()
  }</code></pre><h2 id="ciclos-de-reten-o"><strong>Ci<strong>cl</strong>o<strong>s</strong> de retenção</strong></h2><p>Aviso: eu estou muito no início dos meus estudos nova para entender os ciclos de retenção! Aqui está a essência do que eu pesquisei on-line.</p><p>Os ciclos de retenção são importantes para o gerenciamento de memória. Basicamente, você quer que seu aplicativo limpe pedaços de memória de que não precisa mais. Suponho que isso torna o aplicativo mais eficiente.<br>Há muitas maneiras de o Swift ajudar você a fazer isso automaticamente.</p><p>No entanto, há muitas maneiras de codificar acidentalmente ciclos de retenção em seu aplicativo. Um ciclo de retenção significa que seu aplicativo sempre manterá a memória para um determinado trecho de código. Geralmente, isso acontece quando você tem duas coisas que têm indicadores fortes uma para a outra.</p><p>Para contornar isso, as pessoas costumam usar <code>weak</code>. Quando um lado do código é <code>weak</code>, você não tem um ciclo de retenção e seu aplicativo poderá liberar a memória.</p><p>Para nosso propósito, um padrão comum é usar <code>[weak self]</code> ao chamar a API. Isso garante que, assim que o manipulador de conclusão retornar algum código, o aplicativo possa liberar a memória.</p><pre><code class="language-swift">fetchFilms { [weak self] (films) in
  // Seu código aqui
}</code></pre><h2 id="fila-de-despacho-dispatchqueue-em-ingl-s-">Fila de despacho (<strong><strong><em>DispatchQueue</em></strong>, em inglês)</strong></h2><p>O Xcode usa diferentes <em>threads </em>para executar código em paralelo. A vantagem de vários <em>threads </em>está no fato de que você não fica parado esperando que uma coisa termine antes de passar para a próxima. Espero que você já esteja vendo a ligação com os manipuladores de conclusão aqui.</p><p>Esses <em>threads</em> também parecem ser chamados de filas de despacho. As chamadas de API são tratadas em uma fila – normalmente, uma fila em segundo plano. Depois de ter os dados de sua chamada de API, provavelmente você desejará mostrar esses dados ao usuário. Isso significa que você desejará atualizar sua visualização de tabela.</p><p>As exibições de tabela fazem parte da interface do usuário. Todas as manipulações da interface do usuário devem ser feitas na fila de despacho principal. Isso significa que, em algum lugar no seu arquivo de controlador de visualização, geralmente, como parte da função <code>viewDidLoad</code>, você deve ter um trecho de código que diga à sua visualização de tabela para atualizar.</p><p>Queremos que a visualização de tabela seja atualizada apenas quando tiver alguns novos dados da API. Isso significa que usaremos um manipulador de conclusão para nos avisar quando a chamada da API for concluída. Vamos esperar até esse aviso antes de atualizar a tabela.</p><p>O código será algo como:</p><pre><code class="language-swift">fetchFilms { [weak self] (films) in
  self.films = films

  // Recarregar a visualização de tabela usando a fila de despacho principal
  DispatchQueue.main.async {
    tableView.reloadData()
  }
}</code></pre><h2 id="viewdidload-x-viewdidappear"><strong><strong>viewDidLoad </strong>x<strong> viewDidAppear</strong></strong></h2><p>Finalmente, você precisa decidir onde chamar sua função <code>fetchfilms</code>. Ele estará dentro de um controlador (em inglês, <em>controller</em>) de visualização, que usará os dados da API. Existem dois lugares óbvios em que você pode fazer essa chamada de API. Um está dentro de <code>viewDidLoad</code> e o outro está dentro de <code>viewDidAppear</code>.</p><p>Esses são dois estados diferentes para seu aplicativo. Meu entendimento é o de que <code>viewDidLoad</code> é chamado na primeira vez em que você carrega essa visualização em primeiro plano. <code>viewDidAppear</code> é chamado toda vez que você volta a essa visualização, por exemplo, quando você pressiona o botão Voltar para voltar à visualização.</p><p>Se você espera que seus dados mudem entre os momentos em que o usuário navegará para e a partir dessa visualização, convém colocar sua chamada de API em <code>viewDidAppear</code>. No entanto, acho que para quase todos os aplicativos <code>viewDidLoad</code> é suficiente. A Apple recomenda <code>viewDidAppear</code> para todas as chamadas de API, mas isso parece um exagero. Imagino que isso tornaria seu aplicativo menos eficiente, pois está fazendo muito mais chamadas de API do que precisa.</p><h2 id="combinando-todas-as-etapas">Combinando todas as etapas</h2><p>Primeiro: escreva a função que chama a API. Acima, essa função é a <code>fetchFilms</code>. Ela terá um manipulador de conclusão, que retornará os dados nos quais você está interessado. No meu exemplo, o manipulador de conclusão retorna um <em>array</em> de filmes.</p><p>Segundo: chame essa função em seu controlador de visualização. Você faz isso aqui porque deseja atualizar a visualização com base nos dados da API. No meu exemplo, estou atualizando uma visualização de tabela assim que a API retornar os dados.</p><p>Terceiro: decida onde em seu controlador de visualização você gostaria de chamar a função. No meu exemplo, eu chamo de <code>viewDidLoad</code>.</p><p>Quarto: decida o que fazer com os dados da API. No meu exemplo, estou atualizando uma visualização de tabela.</p><p>Dentro de <code>NetworkManager.swift</code> (esta função pode ser definida em seu controlador de visualização se você quiser, mas estou usando o padrão MVVM).</p><pre><code class="language-swift">func fetchFilms(completionHandler: @escaping ([Film]) -&gt; Void) {
    let url = URL(string: domainUrlString + "films/")!

    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
      if let error = error {
        print("Erro ao obter os filmes: \(error)")
        return
      }
      
      guard let httpResponse = response as? HTTPURLResponse,
            (200...299).contains(httpResponse.statusCode) else {
        print("Erro na responta. Código de status inesperado: \(response)")
        return
      }

      if let data = data,
        let filmSummary = try? JSONDecoder().decode(FilmSummary.self, from: data) {
        completionHandler(filmSummary.results ?? [])
      }
    })
    task.resume()
  }</code></pre><p>Dentro de <code>FilmsViewController.swift</code>:</p><pre><code class="language-swift">final class FilmsViewController: UIViewController {
  private var films: [Film]?

  override func viewDidLoad() {
    super.viewDidLoad()
    
    NetworkManager().fetchFilms { [weak self] (films) in
      self?.films = films
      DispatchQueue.main.async {
        self?.tableView.reloadData()
      }
    }
  }
  
  // o resto do código para o controlador de visualizações
}</code></pre><p>Puxa, conseguimos! Obrigado por ficar comigo até o final da leitura.</p><h4 id="se-essa-publica-o-foi-til-para-voc-compartilhe-obrigada-"><strong><strong>Se essa publicação foi útil para você, compartilhe! Obrigad</strong>a<strong>!</strong></strong></h4> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
