<?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[ Rest API - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Rest API - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 20 Jun 2026 19:47:58 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/rest-api/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tutorial API REST – Client REST, Servizio REST e Chiamate API, Spiegati con Esempi di Codice ]]>
                </title>
                <description>
                    <![CDATA[ Ti sei mai chiesto come funziona la registrazione o l'accesso a un sito web dietro le quinte? Oppure come mai quando cerchi  "gattini carini" su YouTube ottieni una serie di risultati e sei in grado di riprodurre il contenuto del relativo video situato in una macchina remota? In questa guida ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/tutorial-rest-api-client-rest-servizio-rest-e-chiamate-api/</link>
                <guid isPermaLink="false">63e227e70916b8062b0a31cd</guid>
                
                    <category>
                        <![CDATA[ Rest API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Wed, 15 Feb 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/5f9c9b84740569d1a4ca2c3f.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/rest-api-tutorial-rest-client-rest-service-and-api-calls-explained-with-code-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">REST API Tutorial – REST Client, REST Service, and API Calls Explained With Code Examples</a>
      </p><p>Ti sei mai chiesto come funziona la registrazione o l'accesso a un sito web dietro le quinte? Oppure come mai quando cerchi &nbsp;"gattini carini" su YouTube ottieni una serie di risultati e sei in grado di riprodurre il contenuto del relativo video situato in una macchina remota?</p><p>In questa guida rivolta ai principianti, ti guiderò attraverso il processo dell'impostazione di una API RESTful. Declassificheremo alcuni dei termini gergali e daremo un'occhiata a come possiamo scrivere codice per creare un server in NodeJS. Addentriamoci nelle profondità di JavaScript!</p><h2 id="sbarazziamoci-del-gergo"><strong>Sbarazziamoci del gergo</strong></h2><p>Cos'è REST? Secondo <a href="https://it.wikipedia.org/wiki/Representational_state_transfer">Wikipedia</a> (estratto):</p><blockquote><strong><strong>R</strong>E<strong>presentational </strong>S<strong>tate </strong>T<strong>ransfer</strong></strong> (<strong><strong>REST</strong></strong>) è uno schema architetturale per software che definisce una serie di vincoli da usare per creare servizi Web. I servizi Web RESTful consentono ai sistemi richiedenti di accedere a rappresentazioni testuali di risorse Web e manipolarle utilizzando un insieme uniforme e predefinito di operazioni stateless (prive di stato).</blockquote><p>Demistifichiamo il suo significato. REST è fondamentalmente un insieme di regole per la comunicazione tra un client e un server. Ci sono alcuni vincoli sulla definizione di REST:</p><ol><li><strong>Architettura client-server</strong>: l'interfaccia utente del sito web o app dovrebbe essere separata dalla richiesta/memorizzazione dei dati, in modo che ciascuna parte possa essere scalabile in modo indipendente.</li><li><strong>Privo di stato </strong>(stateless): la comunicazione non dovrebbe avere alcun contesto client memorizzato sul server. Il che significa che ogni richiesta al server dovrebbe essere fatta con tutti i dati richiesti e che non si può contare sul fatto che il server conservi dati da richieste precedenti.</li><li><strong>Sistema stratificato</strong>: il client non dovrebbe essere in grado di determinare se sta comunicando direttamente con il server oppure con un qualche intermediario. Questi server intermediari (potrebbero essere proxy o bilanciatori di carico) consentono stabilità e sicurezza per il server sottostante.</li></ol><p>Va bene, ora che sai cosa sono i servizi REST, ecco alcuni dei termini usati nel titolo dell'articolo:</p><ol><li><strong><strong>Client</strong> <strong>REST</strong></strong>: il codice o un'app che può accedere a questi servizi REST. Ne stai usando una proprio adesso! Esatto, il browser può fungere da client REST non controllato (è il sito web che gestire le richieste del browser). Il browser, per lungo tempo, ha usato una funzione integrata chiamata XMLHttpRequest per tutte le richieste REST. Tuttavia è stata rimpiazzata da <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">FetchAPI</a>, un approccio moderno alle richieste, basato sulle <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">promise</a>. Altri esempi sono librerie di codice come <a href="https://github.com/axios/axios">axios</a>, <a href="https://github.com/visionmedia/superagent">superagent</a> e <a href="https://github.com/sindresorhus/got">got</a> o qualche app dedicata come <a href="https://www.postman.com/">Postman</a> (o una versione online, <a href="https://hoppscotch.io">hoppscotch</a>), oppure uno strumento da riga di comando come <a href="https://curl.haxx.se/">cURL</a>!.</li><li><strong>Servizio <strong>REST</strong></strong>: il server. Ci sono molte popolari librerie che rendono la creazione di questi server un gioco da ragazzi, come <a href="https://expressjs.com/">ExpressJS</a> per NodeJS e <a href="https://www.djangoproject.com/">Django</a> per Python.</li><li><strong><strong>API</strong> <strong>REST</strong></strong>: definisce i punti di contatto (endpoint) e i metodi consentiti per ottenere/inviare dati al server. Parleremo di ciò molto dettagliatamente in seguito. Alcune alternative sono: GraphQL, JSON-Pure e oData.</li></ol><h2 id="allora-dimmi-come-funziona-rest"><strong>Allora dimmi, come funziona REST<strong>?</strong></strong></h2><p>In termini molto ampi, tu chiedi al server di ottenere o di salvare certi dati e il server risponde alla richiesta.</p><p>In termini di programmazione, c'è un endpoint (un URL) sul quale il server è in attesa di ricevere una richiesta. Ci connettiamo a questo endpoint e inviamo alcuni dati su di noi (ricorda, REST è privo di stato, non vengono memorizzati i dati di una richiesta) e il server risponde in modo appropriato.</p><p>Le parole annoiano, ti darò una dimostrazione. Userò Postman per mostrarti richiesta e risposta:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-162.png" class="kg-image" alt="image-162" width="600" height="400" loading="lazy"><figcaption>postman: visualizzazione di una risposta</figcaption></figure><p>I dati restituiti sono in formato <a href="https://en.wikipedia.org/wiki/JSON">JSON</a> (JavaScript Object Notation) e possono essere consultati direttamente.</p><p>L'url <code>https://official-joke-api.appspot.com/random_joke</code> viene detto endpoint dell'API. Ci sarà un server in ascolto su quell'endpoint per richieste come quella che abbiamo fatto noi.</p><h2 id="anatomia-di-rest-"><strong><strong>Anatom</strong>ia di<strong> REST:</strong></strong></h2><p>Ora sappiamo che i dati possono essere richiesti dal client e che il server risponderà in modo appropriato. Esaminiamo nel dettaglio come viene composta una richiesta.</p><ol><li><strong><strong>Endpoint</strong></strong>: di questo ho già parlato. Per ricapitolare si tratta di un URL dove è in ascolto un server REST.</li><li><strong><strong>Method</strong> </strong>(metodo): in precedenza ho scritto che puoi sia richiedere dati che modificarli, ma in che modo il server sa quale tipo di operazione è stata richiesta dal client? REST implementa diversi metodi per diversi tipi di richiesta, i più popolari sono:<br>- <strong><strong>GET</strong></strong>: ottiene risorse dal server.<br>- <strong><strong>POST</strong></strong>: crea risorse sul server.<br>- <strong><strong>PATCH </strong></strong>o <strong><strong>PUT</strong></strong>: aggiorna risorse esistenti sul server.<br>- <strong><strong>DELETE</strong></strong>: elimina risorse esistenti dal server.</li><li><strong><strong>Header</strong>s </strong>(intestazioni): i dettagli aggiuntivi forniti per la comunicazione tra client e server (ricorda, REST è stateless). Alcuni dei più comuni sono:<br><strong>Nella richiesta<strong>:</strong></strong><br>- <em><em>host</em></em>: l'indirizzo IP del client (o da dove ha avuto origine la richiesta)<br>- <em><em>accept-language</em></em>: il linguaggio comprensibile dal client<br>- <em><em>user-agent</em></em>: dati di client, sistema operativo e browser<br><strong>Nella risposta</strong>:<br>- <em><em>status</em></em>: lo stato oppure il codice HTTP della richiesta<br>- <em><em>content-type</em></em>: il tipo di risorsa inviata dal server<br>- <em><em>set-cookie</em></em>: i cookie impostati dal server</li><li><strong><strong>Dat</strong>a </strong>(dati): chiamato anche body (corpo) o message (messaggio); contiene le informazioni che vuoi inviare al server.</li></ol><h2 id="basta-con-i-dettagli-fammi-vedere-il-codice"><strong>Basta con i dettagli <strong>–</strong> fammi vedere il codice</strong></h2><p>Iniziamo a scrivere del codice per un servizio REST in Node. Implementeremo tutte le cose che abbiamo imparato qui sopra. Inoltre useremo la sintassi ES6 e superiore per scrivere il nostro servizio.</p><p>Assicurati di avere Node.JS installato e che i comandi <code>node</code> e <code>npm</code> siano inclusi nel tuo percorso. Userò Node 12.16.2 e NPM 6.14.4.</p><p>Crea una directory <code>rest-service-node</code> e portati su di essa:</p><pre><code class="language-shell">mkdir rest-service-node
cd rest-service-node</code></pre><p>Inizializza il progetto node:</p><pre><code class="language-shell">npm init -y</code></pre><p>Con l'opzione <code>-y</code> &nbsp;accetti tutte le risposte predefinite alle domande poste dallo script. Se vuoi compilare personalmente l'intero questionario esegui semplicemente <code>npm init</code>.</p><p>Installiamo alcuni pacchetti. Useremo il framework <a href="https://expressjs.com/it/">ExpressJS</a> per sviluppare il server REST. Esegui il comando seguente per installarlo:</p><pre><code class="language-shell">npm install --save express body-parser</code></pre><p>A cosa serve <code>body-parser</code>? Express, nella modalità predefinita, non è in grado di gestire i dati inviati tramite una richiesta POST in formato JSON. <code>body-parser</code> consente a Express di superare questo ostacolo.</p><p>Crea un file chiamato <code>server.js</code> e aggiungi il codice seguente:</p><pre><code class="language-js">const express = require("express");
const bodyParser = require("body-parser");

const app = express();

app.use(bodyParser.json());

app.listen(5000, () =&gt; {
  console.log(`Server is running on port 5000.`);
});
</code></pre><p>Le prime due righe importano Express e body-parser.</p><p>La terza riga inizializza il server Express e lo associa a una variabile chiamata <code>app</code>.</p><p>La riga, <code>app.use(bodyParser.json());</code> inizializza il plugin body-parser.</p><p>Per ultimo impostiamo il nostro server per ricevere le richieste sulla porta <code>5000</code>.</p><h3 id="ottenere-dati-da-un-server-rest-"><strong>Ottenere dati da un server<strong> REST:</strong></strong></h3><p>Per ottenere dati da un server ci serve una richiesta di tipo <code>GET</code>. Aggiungi il seguente codice prima di &nbsp;<code>app.listen</code>:</p><pre><code class="language-js">const sayHi = (req, res) =&gt; {
  res.send("Hi!");
};

app.get("/", sayHi);</code></pre><p>Abbiamo creato una funzione <code>sayHi</code> che riceve due parametri: <code>req</code> e <code>res</code> (la spiegazione in seguito) e invia un 'Hi!' come risposta.</p><p><code>app.get()</code> riceve due parametri, il percorso della rotta e la funzione da chiamare quando il percorso viene richiesto dal client. Pertanto l'ultima riga significa: ehi server, mettiti in ascolto per richieste sul percorso &nbsp;'/' (pensa homepage) e chiama la funzione <code>sayHi</code> se viene effettuata una richiesta.</p><p><code>app.get</code> ci fornisce anche un oggetto <code>request</code> che contiene tutti i dati inviati dal client e un oggetto <code>response</code> che contiene tutti i metodi con i quali possiamo rispondere al client. Anche se sono accessibili come parametri di funzione, è consigliato per convenzione generale che vengano chiamati <code>res</code> per <code>response</code> e <code>req</code> per <code>request</code>.</p><p>Bando alle ciance. Lanciamo il server! Esegui il seguente comando:</p><pre><code class="language-shell">node server.js</code></pre><p>Se tutto va bene dovresti vedere un messaggio nella console che dice: <em><em>Server is running on port 5000</em> </em>(il server è in esecuzione sulla porta 5000)<em><em>.</em></em></p><p><em><em>Not</em>a<em>: </em>Puoi cambiare la porta di ascolto con un altro numero, tuttavia evitando di usare quelle <a href="https://it.wikipedia.org/wiki/Porte_TCP_e_UDP_standard">standard utilizzate da altri servizi</a><em>.</em></em></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-160.png" class="kg-image" alt="image-160" width="600" height="400" loading="lazy"></figure><p>Apri il tuo browser e nella barra degli indirizzi inserisci <code>http://localhost:5000/</code>. Dovresti vedere qualcosa tipo questo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-161.png" class="kg-image" alt="image-161" width="600" height="400" loading="lazy"></figure><p>Fatto! La tua prima richiesta <code>GET</code> ha avuto successo!</p><h3 id="inviare-dati-al-server-rest"><strong>Inviare dati al server REST</strong></h3><p>Come accennato in precedenza, implementiamo la gestione di una richiesta <code>POST</code> nel nostro server che restituisce la somma di due numeri interi ricevuti nella richiesta. Invieremo due numeri e il server in risposta restituirà la loro somma. Aggiungi questo nuovo metodo dopo <code>app.get</code>:</p><pre><code class="language-js">app.post("/add", (req, res) =&gt; {
  const { a, b } = req.body;
  res.send(`The sum is: ${a + b}`);
});</code></pre><p>Noi invieremo i dati in formato JSON, in questo modo:</p><pre><code class="language-json">{
    "a":5,
    "b":10
}</code></pre><p>Esaminiamo il codice:</p><p>Nella prima riga chiamiamo il metodo <code>.post()</code> di ExpressJS, che consente al server di gestire richieste <code>POST</code>. Questa funzione riceve gli stessi parametri del metodo <code>.get()</code>. Il percorso che passiamo è <code>/add</code>, quindi si potrà contattare l'endpoint come <code>http://il-tuo-indirizzo-ip:porta/add</code> oppure, nel nostro caso, <code>localhost:5000/add</code>. Invece di scrivere una funzione altrove gestiamo tutto all'interno.</p><p>Nella seconda riga abbiamo usato un po' di sintassi ES6, nella fattispecie la destrutturazione di un oggetto. Qualsiasi dato inviamo tramite richiesta viene conservato ed è disponibile nella chiave <code>body</code> dell'oggetto <code>req</code>. Quindi in sostanza avremmo potuto sostituire la seconda riga con qualcosa tipo:</p><pre><code class="language-js">const num1 = req.body.a;
const num2 = req.body.b;</code></pre><p>Nella terza riga usiamo il metodo <code>send()</code> dell'oggetto <code>res</code> per inviare il risultato dell'addizione. Ancora una volta usiamo i template literals da ES6. Ora facciamo un test (usando Postman):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-163.png" class="kg-image" alt="image-163" width="600" height="400" loading="lazy"></figure><p>Abbiamo inviato i dati &nbsp;5 e 10 associati alle chiavi <code>a</code> e <code>b</code> inserendoli come body. Postman allega questi dati alla richiesta e la invia. Quando il server riceve la richiesta può elaborare i dati da <code>req.body</code>, come abbiamo fatto nel codice qui sopra. Il risultato è mostrato più sotto.</p><p>Ecco il codice fino a ora:</p><pre><code class="language-js">const express = require("express");
const bodyParser = require("body-parser");

const app = express();

app.use(bodyParser.json());

const sayHi = (req, res) =&gt; {
  res.send("Hi!");
};

app.get("/", sayHi);

app.post("/add", (req, res) =&gt; {
  const { a, b } = req.body;
  res.send(`The sum is: ${a + b}`);
});

app.listen(5000, () =&gt; {
  console.log(`Server is running on port 5000.`);
});
</code></pre><h2 id="client-rest-"><strong><strong>Client</strong> <strong>REST:</strong></strong></h2><p>Va bene, abbiamo creato il server, ma come vi accediamo dal nostro sito web o app web? Qui le librerie client REST torneranno utili.</p><p>Andremo a costruire una pagina web che conterrà un form, dove potrai digitare i due numeri da sommare, poi visualizzeremo il risultato. Iniziamo.</p><p>Per prima cosa modifichiamo un poco <code>server.js</code>:</p><pre><code class="language-js">const path = require("path");
const express = require("express");
const bodyParser = require("body-parser");

const app = express();

app.use(bodyParser.json());

app.get("/", (req, res) =&gt; {
  res.sendFile(path.join(__dirname, "index.html"));
});

app.post("/add", (req, res) =&gt; {
  const { a, b } = req.body;
  res.send({
    result: parseInt(a) + parseInt(b)
  });
});

app.listen(5000, () =&gt; {
  console.log(`Server is running on port 5000.`);
});
</code></pre><p>Abbiamo importato un nuovo pacchetto, &nbsp;<code>path</code>, fornito da Node, per manipolare i percorsi indipendentemente dalla piattaforma. Poi abbiamo cambiato la richiesta <code>GET</code> su <code>/</code> e usato un altro metodo disponibile in <code>res</code>, vale a dire <code>sendFile</code>, che ci consente di inviare qualunque tipo di file come risposta. Quindi quando qualcuno si porterà sul percorso <code>/</code>, otterrà la nostra pagina <code>index.html</code>.</p><p>Infine abbiamo cambiato la nostra funzione <code>app.post</code> affinché restituisca la somma in formato JSON e converta in interi sia <code>a</code> che <code>b</code>.</p><p>Creiamo una pagina html, che chiameremo <code>index.html</code>, con uno stile di base:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
    &lt;title&gt;REST Client&lt;/title&gt;
  &lt;/head&gt;
  &lt;style&gt;
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    .container {
      height: 100vh;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
    form {
      display: flex;
      flex-direction: column;
      margin-bottom: 20px;
    }
    label,
    input[type="submit"] {
      margin-top: 20px;
    }
  &lt;/style&gt;
  &lt;body&gt;
    &lt;div class="container"&gt;
      &lt;h1&gt;Simple POST Form&lt;/h1&gt;
      &lt;/h1&gt;
      &lt;form&gt;
        &lt;label&gt;Number 1:&lt;/label&gt;
        &lt;input id="num1" type="number" /&gt;
        &lt;label&gt;Number 2:&lt;/label&gt;
        &lt;input id="num2" type="number" /&gt;
        &lt;input type="submit" value="Add"/&gt;
      &lt;/form&gt;
      &lt;div class="result"&gt;Click Add!&lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>Aggiungiamo un tag <code>script</code> appena prima del tag di chiusura <code>body</code> per evitare di dover gestire un file <code>.js</code> separato. Inizieremo con l'inserire un event listener per l'evento <code>submit</code> che chiamerà la funzione <code>sendData</code>:</p><pre><code class="language-js">&lt;script&gt;
	document.addEventListener("submit", sendData);
&lt;/script&gt;</code></pre><p>All'interno della funzione, per prima cosa, dobbiamo impedire l'aggiornamento della pagina quando viene fatto click sul pulsante 'Add'. Questo si può fare chiamando il metodo <code>preventDefault()</code> dell'evento. Poi catturiamo i valori delle caselle di testo, vale a dire i numeri da sommare:</p><pre><code class="language-js">function sendData(e) {
    e.preventDefault();
    const a = document.querySelector("#num1").value;
    const b = document.querySelector("#num2").value;
}</code></pre><p>Ora facciamo una chiamata al server passando i valori di <code>a</code> e <code>b</code>. Useremo l'API <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch</a>, integrata su tutte le versioni più recenti dei browser.</p><p>Fetch riceve due parametri, l'URL dell'endpoint e un oggetto JSON con i dettagli della richiesta, e ritorna una <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">promise</a>. Spiegare cos'è una promise va oltre lo scopo di questo articolo pertanto lascio a te scoprirlo.</p><p>Proseguiamo aggiungendo quanto segue all'interno della funzione <code>sendData()</code>:</p><pre><code class="language-js">fetch("/add", {
        method: "POST",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            a: parseInt(a),
            b: parseInt(b)
        })
    })
    .then(res =&gt; res.json())
    .then(data =&gt; {
        const {
            result
        } = data;
        document.querySelector(
            ".result"
        ).innerText = `The sum is: ${result}`;
    })
    .catch(err =&gt; console.log(err));</code></pre><p>Per prima cosa chiamiamo la funzione <code>fetch</code> passando l'URL che corrisponde all'endpoint desiderato come primo parametro. Come secondo parametro passiamo un oggetto che contiene:</p><ul><li>nella chiave <code>method</code> il nome del tipo di metodo, POST in questo caso che, dovrà essere usato per effettuare la richiesta</li><li>nella chiave <code>headers</code> un oggetto con le informazioni relative al tipo di dati che stiamo inviando (chiave <code>Content-Type</code>) e tipo di dati che accettiamo come risposta (chiave <code>Accept</code>)</li><li>nella chiave <code>body</code> passiamo il corpo del messaggio, vale a dire i numeri che devono essere sommati, forzando la conversione a valori interi, visto che non abbiamo implementato sul server una verifica sul tipo dei dati, sotto forma di stringa JSON, come specificato nell'header <code>Content-Type</code>, tramite la funzione <code>JSON.stringify()</code></li></ul><p>Infine, se la promise (ritornata da fetch) si risolve, otteniamo la risposta e la convertiamo in JSON. Successivamente recuperiamo il risultato dalla chiave <code>data</code> ritornato dalla risposta, che andremo a visualizzare sullo schermo.</p><p>Se la promise viene rigettata, visualizzeremo un messaggio di errore nella console.</p><p>Ecco il codice finale per <code>index.html</code>:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
    &lt;title&gt;REST Client&lt;/title&gt;
  &lt;/head&gt;
  &lt;style&gt;
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    .container {
      height: 100vh;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
    form {
      display: flex;
      flex-direction: column;
      margin-bottom: 20px;
    }
    label,
    input[type="submit"] {
      margin-top: 20px;
    }
  &lt;/style&gt;
  &lt;body&gt;
    &lt;div class="container"&gt;
      &lt;h1&gt;Simple POST Form&lt;/h1&gt;
      &lt;/h1&gt;
      &lt;form&gt;
        &lt;label&gt;Number 1:&lt;/label&gt;
        &lt;input id="num1" type="number" /&gt;
        &lt;label&gt;Number 2:&lt;/label&gt;
        &lt;input id="num2" type="number" /&gt;
        &lt;input type="submit" value="Add"/&gt;
      &lt;/form&gt;
      &lt;div class="result"&gt;Click Add!&lt;/div&gt;
    &lt;/div&gt;
    &lt;script&gt;
      document.addEventListener("submit", sendData);
      function sendData(e) {
        e.preventDefault();
        const a = document.querySelector("#num1").value;
        const b = document.querySelector("#num2").value;

        fetch("/add", {
          method: "POST",
          headers: {
            Accept: "application/json",
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            a: parseInt(a),
            b: parseInt(b)
          })
        })
          .then(res =&gt; res.json())
          .then(data =&gt; {
            const { result } = data;
            document.querySelector(
              ".result"
            ).innerText = `The sum is: ${result}`;
          })
          .catch(err =&gt; console.log(err));
      }
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Ho inserito <a href="https://habitual-serious-boater.glitch.me/">una piccola app su glitch</a> per te da provare.</p><h2 id="conclusione"><strong><strong>Conclusion</strong>e</strong></h2><p>In questo post abbiamo imparato cos'è l'architettura REST e l'anatomia delle richieste REST. Abbiamo creato un semplice server REST che risponde a richieste <code>GET</code> e <code>POST</code> e costruito una semplice pagina web che usa un client REST per visualizzare la somma di due numeri.</p><p>Puoi ulteriormente ampliare il codice del server codificando anche le risposte per gli altri tipi di richiesta e addirittura implementare una completa <a href="https://www.freecodecamp.org/news/building-a-simple-crud-application-with-express-and-mongodb-63f80f3eb1cd/">app back-end per operazioni CRUD</a>.</p><p>Spero che tu abbia imparato qualcosa da questo post. Se hai una qualsiasi domanda, sentiti libero di contattarmi su twitter. Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guida per Principianti all'Utilizzo di API REST in React ]]>
                </title>
                <description>
                    <![CDATA[ React è una popolare libreria frontend che gli sviluppatori usano per creare applicazioni. Se vuoi creare app pronte per la produzione, a un certo punto dovrai integrare le API nella tua applicazione React. Ogni sviluppatore che voglia costruire applicazioni web moderne e robuste con React deve sapere come utilizzare le ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/guida-per-principianti-allutilizzo-di-api-rest-in-react/</link>
                <guid isPermaLink="false">634be9773c79fc06aad9f61d</guid>
                
                    <category>
                        <![CDATA[ Rest API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Tue, 15 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/10/cover-template-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-consume-rest-apis-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/how-to-consume-rest-apis-in-react/</a>
      </p><p>React è una popolare libreria frontend che gli sviluppatori usano per creare applicazioni. Se vuoi creare app pronte per la produzione, a un certo punto dovrai integrare le API nella tua applicazione React.</p><p>Ogni sviluppatore che voglia costruire applicazioni web moderne e robuste con React deve sapere come utilizzare le API per ottenere dati da inserire nelle proprie applicazioni React.</p><p>In questa guida per principianti imparerai come utilizzare API RESTful in React, incluso il recupero, l'eliminazione e l'aggiunta di dati. Esamineremo anche i due modi principali per utilizzare le API RESTful e come usarle con gli hook di React.</p><h2 id="cos-una-api-rest">Cos'è una API REST?</h2><p>Se hai mai dedicato del tempo a programmare o fare ricerche sulla programmazione, probabilmente ti sei imbattuto nel termine "API".</p><p>API sta per Application Programming Interface (Interfaccia di Programmazione per un'Applicazione). È un mezzo che consente a diverse applicazioni di comunicare tra loro in modo programmatico e restituire una risposta in tempo reale.</p><p>Roy Fielding ha definito REST nel 2000 come uno stile architetturale e una metodologia comunemente utilizzati nello sviluppo di servizi internet, come i sistemi ipermediali distribuiti. È un acronimo che sta per "REpresentational State Transfer".</p><p>Quando viene effettuata una richiesta tramite API REST, viene inviata una rappresentazione dello stato corrente di una risorsa al richiedente o &nbsp;endpoint. Questa rappresentazione dello stato può essere in formato JSON (JavaScript Object Notation), XML, o HTML.</p><p>JSON è il formato di file maggiormente usato in quanto è indipendente dal linguaggio e può essere letto sia dall'uomo che dalle macchine.</p><p><strong>Pe<strong>r e</strong>se<strong>mp</strong>io<strong>:</strong></strong></p><pre><code class="language-json">[
   {
      "userId": 1,
      "id": 1,
      "title": "sunt excepturi",
      "body": "quia et suscipit\nsuscipit recusandae consequuntur "
   },
   {
      "userId": 1,
      "id": 2,
      "title": "qui est esse",
      "body": "est rerum tempore vitae\nsequi sint nihil"
   }
]</code></pre><h2 id="come-utilizzare-le-api-rest-in-react"><strong>Come Utilizzare le API REST in React</strong></h2><p>Ci sono svariati modi di utilizzare una API REST in una applicazione React, ma in questa guida, daremo uno sguardo a due degli approcci più popolari: &nbsp;Axios (un client HTTP basato su promise) e l'API Fetch (una API web integrata nel browser).</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> Dovresti avere familiarità con JavaScript, React, e gli hook React, poiché sono fondamentali per una piena comprensione di questa guida.</p><p>Prima di approfondire come utilizzare le API, è importante capire che l'utilizzo di API in React è molto diverso da come avviene in JavaScript. Questo perché le richieste vengono eseguite in un Componente React.</p><p>Nel nostro caso utilizzeremo componenti funzionali, il che significa che dovremo usare due dei principali hook di React:</p><ul><li><strong>hook <strong>useEffect</strong></strong>: in React, eseguiamo le richieste API all'interno dell'hook <code>useEffect()</code> . Con questo hook il codice viene eseguito immediatamente quando il componente che lo contiene viene caricato oppure dopo che viene raggiunto uno specifico stato. Questa è la sintassi generale che useremo:</li></ul><pre><code>useEffect(() =&gt; {
    // qui il recupero dei dati
}, []);
</code></pre><ul><li><strong>hook <strong>useState</strong></strong>: quando richiediamo dati, dobbiamo preparare uno stato nel quale i dati verranno conservati una volta restituiti. Possiamo salvare lo stato in uno strumento per la gestione dello stato come Redux oppure in un oggetto nel contesto. Per mantenere le cose semplici, conserveremo i dati restituiti in uno stato locale React.</li></ul><pre><code>const [posts, setPosts] = useState([]);
</code></pre><p>Entriamo ora nel vivo di questa guida, dove impareremo come ottenere, aggiungere ed eliminare i dati utilizzando l'<a href="https://jsonplaceholder.typicode.com/posts">API dei post JSONPlaceholder</a>. Questa conoscenza è applicabile a qualsiasi tipo di API, poiché questa guida è destinata ai principianti.</p><h2 id="come-utilizzare-le-api-usando-l-api-fetch"><strong>Come Utilizzare le API Usando l'API Fetch</strong></h2><p>L'API Fetch è un metodo JavaScript integrato per recuperare risorse da un server o da un endpoint API. Essendo integrato, non necessita di installazione di alcuna dipendenza o pacchetto.</p><p>Il metodo <code>fetch()</code> richiede un argomento obbligatorio, che è il percorso o URL della risorsa che si vuole ottenere. Restituisce poi una Promise in modo che tu possa gestire successo o fallimento usando i metodi <code>then()</code> e <code>catch()</code>.</p><p>Una richiesta di recupero di base è molto semplice da scrivere e ha l'aspetto del codice seguente. Stiamo semplicemente recuperando i dati da un URL che restituisce i dati come JSON, che poi stampiamo nella console:</p><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
   .then(response =&gt; response.json())
   .then(data =&gt; console.log(data));
</code></pre><p>In genere la risposta predefinita è una normale risposta HTTP invece che l'effettivo JSON, ma possiamo ottenere il nostro risultato come oggetto JSON usando il metodo <code>json()</code> della risposta.</p><h3 id="come-eseguire-una-richiesta-get-in-react-con-l-api-fetch"><strong>Come Eseguire una Richiesta GET in React con l'API Fetch </strong></h3><p>Puoi usare il metodo HTTP GET per richiedere dati da un endpoint.</p><p>Come detto in precedenza, l'API Fetch riceve un argomento obbligatorio. Accetta &nbsp;anche un argomento facoltativo, specialmente se si usa il metodo predefinito GET, rappresentato da un oggetto, tuttavia per gli altri metodi come POST e DELETE questo argomento è richiesto in quanto in esso va inserito il tipo di metodo da utilizzare:</p><pre><code class="language-js">fetch(url, {
    method: "GET" // predefinito, possiamo ignorarlo
})
</code></pre><p>Fino a qui abbiamo imparato come funzionano le cose, ora mettiamo tutto insieme ed eseguiamo una richiesta get per ottenere dati dalla nostra API.</p><p>Nuovamente, useremo l'<a href="https://jsonplaceholder.typicode.com/posts">API libera online JSONPlaceholder</a> per recuperare un elenco di post per la nostra applicazione:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [posts, setPosts] = useState([]);
   useEffect(() =&gt; {
      fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
         .then((response) =&gt; response.json())
         .then((data) =&gt; {
            console.log(data);
            setPosts(data);
         })
         .catch((err) =&gt; {
            console.log(err.message);
         });
   }, []);

return (
   // ... qui i dati vengono utilizzati
);
};
</code></pre><p>Nella parte di codice precedente abbiamo creato codice per conservare i dati che otteniamo dall'API così da poterli utilizzare più tardi nella nostra applicazione. Abbiamo anche impostato come valore predefinito un array vuoto.</p><pre><code class="language-js">const [posts, setPosts] = useState([]);
</code></pre><p>Il grosso dell'operazione si svolge nell'hook useEffect, in modo che i dati/post siano recuperati non appena l'applicazione viene caricata. La richiesta di recupero dati genera una promise, che possiamo accettare o rifiutare:</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10').then(
      (response) =&gt; console.log(response)
   );
}, []);
</code></pre><p>Questa risposta contiene una grande quantità di dati, come il codice di stato, testo e altre informazioni che ci serviranno per gestire gli errori successivamente.</p><p>Fino ad ora, abbiamo gestito la risoluzione della promise con <code>.then()</code>, ma essa restituisce un oggetto Response, che non è quello che vogliamo. Dobbiamo estrarre dall'oggetto Response i dati nel formato JSON usando il metodo <code>json()</code>. Anche questo metodo restituisce una promise che possiamo utilizzare per ottenere i dati effettivi usando il secondo <code>.then()</code>.</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         console.log(data);
         setPosts(data);
      });
}, []);
</code></pre><p>Se diamo un'occhiata alla console, vedremo che abbiamo recuperato 10 post dalla nostra API, che abbiamo poi assegnato allo stato specificato in precedenza.</p><p>Non abbiamo ancora finito, in quanto abbiamo gestito solo la parte di risoluzione della promise, non la parte di rifiuto, che gestiremo tramite il metodo <code>.catch()</code> :</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         console.log(data);
         setPosts(data);
      })
      .catch((err) =&gt; {
         console.log(err.message);
      });
}, []);
</code></pre><p>Fino a ora abbiamo visto come eseguire una richiesta GET, che può essere facilmente usata nella nostra applicazione eseguendo un loop sul nostro array:</p><pre><code class="language-js">const App = () =&gt; {
// ...

   return (
   &lt;div className="posts-container"&gt;
      {posts.map((post) =&gt; {
         return (
            &lt;div className="post-card" key={post.id}&gt;
               &lt;h2 className="post-title"&gt;{post.title}&lt;/h2&gt;
               &lt;p className="post-body"&gt;{post.body}&lt;/p&gt;
               &lt;div className="button"&gt;
               &lt;div className="delete-btn"&gt;Delete&lt;/div&gt;
               &lt;/div&gt;
            &lt;/div&gt;
         );
      })}
   &lt;/div&gt;
   );
};

export default App;
</code></pre><h3 id="come-eseguire-una-richiesta-post-in-react-con-l-api-fetch"><strong>Come Eseguire una Richiesta POST in React con l'API Fetch </strong></h3><p>Possiamo usare il metodo HTTP <code>POST</code> per inviare dati verso un endpoint. Funziona in modo simile alla richiesta <code>GET</code>, la differenza principale è che dobbiamo aggiungere il tipo di metodo e due parametri aggiuntivi all'oggetto che contiene i dati opzionali:</p><pre><code class="language-js">const addPosts = async (title, body) =&gt; {
await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
   title: title,
   body: body,
   userId: Math.random().toString(36).slice(2),
}),
headers: {
   'Content-type': 'application/json; charset=UTF-8',
},
})
.then((response) =&gt; response.json())
.then((data) =&gt; {
   setPosts((posts) =&gt; [data, ...posts]);
   setTitle('');
   setBody('');
})
.catch((err) =&gt; {
   console.log(err.message);
});
};
</code></pre><p>I principali parametri che potrebbero apparire strani sono <code>body</code> e <code>headers</code>.</p><p><code>body</code> contiene i dati che vogliamo passare all'API, che prima dobbiamo convertire in stringa JSON in quanto stiamo inviando dati a un server web. <code>headers</code> specifica il tipo di dati, che sarà sempre lo stesso quando si utilizzano API REST. Impostiamo anche lo stato per conservare i nuovi dati e distribuire i dati rimasti nell'array.</p><p>Osservando il metodo <code>addPost()</code> che abbiamo creato, ci attendiamo che questi dati provengano da un form o altro. Nel nostro caso, ho creato un form, ottenuto i dati del form tramite stati, quindi li ho aggiunti al metodo una volta che il form viene inviato:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';
const App = () =&gt; {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
// ...
const addPosts = async (title, body) =&gt; {
   await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      body: JSON.stringify({
         title: title,
         body: body,
         userId: Math.random().toString(36).slice(2),
      }),
      headers: {
         'Content-type': 'application/json; charset=UTF-8',
      },
   })
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         setPosts((posts) =&gt; [data, ...posts]);
         setTitle('');
         setBody('');
      })
      .catch((err) =&gt; {
         console.log(err.message);
      });
};

const handleSubmit = (e) =&gt; {
   e.preventDefault();
   addPosts(title, body);
};    

return (
   &lt;div className="app"&gt;
      &lt;div className="add-post-container"&gt;
         &lt;form onSubmit={handleSubmit}&gt;
            &lt;input type="text" className="form-control" value={title}
               onChange={(e) =&gt; setTitle(e.target.value)}
            /&gt;
            &lt;textarea name="" className="form-control" id="" cols="10" rows="8" 
               value={body} onChange={(e) =&gt; setBody(e.target.value)} 
            &gt;&lt;/textarea&gt;
            &lt;button type="submit"&gt;Add Post&lt;/button&gt;
         &lt;/form&gt;
      &lt;/div&gt;
      {/* ... */}
   &lt;/div&gt;
);
};

export default App;
</code></pre><h3 id="come-eseguire-una-richiesta-delete-in-react-con-l-api-fetch"><strong>Come Eseguire una Richiesta DELETE in React con l'API Fetch</strong></h3><p>Puoi usare il metodo HTTP <code>DELETE</code> per eliminare dati da un endpoint. Funziona in modo simile alla richiesta GET, la differenza principale è l'aggiunta del tipo di metodo nell'oggetto opzionale:</p><pre><code class="language-js">const deletePost = async (id) =&gt; {
await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
   method: 'DELETE',
}).then((response) =&gt; {
   if (response.status === 200) {
      setPosts(
         posts.filter((post) =&gt; {
            return post.id !== id;
         })
      );
   } else {
      return;
   }
});
};
</code></pre><p>La richiesta viene attivata quando viene premuto il pulsante e otteniamo l'<code>id</code> dello specifico post relativo al bottone premuto. Poi eliminiamo quei dati da tutti i dati restituiti.</p><p>Ciò farà si che il post sia rimosso dall'API ma non immediatamente dall'interfaccia utente, ecco perché abbiamo aggiunto un filtro per eliminare anche i dati dall'applicazione. Per ciascun elemento del loop, il pulsante di cancellazione appare in questo modo:</p><pre><code class="language-js">const App = () =&gt; {
// ...

   return (
   &lt;div className="posts-container"&gt;
      {posts.map((post) =&gt; {
         return (
            &lt;div className="post-card" key={post.id}&gt;
               {/* ... */}
               &lt;div className="button"&gt;
                  &lt;div className="delete-btn" onClick={() =&gt; deletePost(post.id)}&gt;
                     Delete
                  &lt;/div&gt;
               &lt;/div&gt;    
            &lt;/div&gt;
         );
      })}
   &lt;/div&gt;
   );
};

export default App;
</code></pre><h3 id="come-usare-async-await-nell-api-fetch"><strong>Come Usare Async/Await nell'API Fetch</strong></h3><p>Fino a ora abbiamo visto come eseguire richieste con Fetch normalmente, utilizzando la sintassi di promise, che a volte può confondere. Poi c'è il concatenamento. Possiamo evitare il concatenamento con <code>.then()</code> usando async/await per scrivere codice più leggibile.</p><p>Per usare async/await, prima si chiama <code>async</code> nella funzione. Poi quando facciamo una richiesta e ci attendiamo una risposta, aggiungiamo la parola chiave <code>await</code> davanti alla chiamata alla funzione dalla quale attendere fino a quando la promise è pronta con il risultato.</p><p>Quando usiamo async/await, tutte le nostre richieste Fetch saranno scritte in questo modo:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [title, setTitle] = useState('');
   const [body, setBody] = useState('');
   const [posts, setPosts] = useState([]);

   // GET with fetch API
   useEffect(() =&gt; {
      const fetchPost = async () =&gt; {
         const response = await fetch(
            'https://jsonplaceholder.typicode.com/posts?_limit=10'
         );
         const data = await response.json();
         console.log(data);
         setPosts(data);
      };
      fetchPost();
   }, []);

   // Delete with fetchAPI
   const deletePost = async (id) =&gt; {
      let response = await fetch(
         `https://jsonplaceholder.typicode.com/posts/${id}`,
         {
            method: 'DELETE',
         }
      );
      if (response.status === 200) {
         setPosts(
            posts.filter((post) =&gt; {
               return post.id !== id;
            })
         );
      } else {
         return;
      }
   };

   // Post with fetchAPI
   const addPosts = async (title, body) =&gt; {
      let response = await fetch('https://jsonplaceholder.typicode.com/posts', {
         method: 'POST',
         body: JSON.stringify({
            title: title,
            body: body,
            userId: Math.random().toString(36).slice(2),
         }),
         headers: {
            'Content-type': 'application/json; charset=UTF-8',
         },
      });
      let data = await response.json();
      setPosts((posts) =&gt; [data, ...posts]);
      setTitle('');
      setBody('');
   };

   const handleSubmit = (e) =&gt; {
      e.preventDefault();
      addPosts(title, body);
   };

   return (
      // ...
   );
};

export default App;
</code></pre><h3 id="come-gestire-gli-errori-con-l-api-fetch"><strong>Come Gestire gli Errori con l'API Fetch</strong></h3><p>In questa sezione, daremo un'occhiata a come gestire gli errori sia nel modo tradizionale che con async/await.</p><p>Possiamo usare i dati in risposta per gestire gli errori nell'API Fetch, oppure possiamo usare l'istruzione try/catch quando utilizziamo async/await.</p><p>Diamo un'occhiata a come possiamo farlo in genere con l'API Fetch:</p><pre><code class="language-js">const fetchPost = () =&gt; {
fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
   .then((response) =&gt; {
      if (!response.ok) {
         throw Error(response.statusText);
      }
      return response.json();
   })
   .then((data) =&gt; {
      console.log(data);
      setPosts(data);
   })
   .catch((err) =&gt; {
      console.log(err.message);
   });
};
</code></pre><p>Puoi trovare ulteriori informazioni sugli errori dell'API Fetch <a href="https://www.tjvantoll.com/2015/09/13/fetch-and-errors/">qui</a>.</p><p>Per quanto riguarda async/await possiamo usare l'istruzione <code>try</code> / <code>catch</code> in questo modo:</p><pre><code class="language-js">const fetchPost = async () =&gt; {
   try {
      const response = await fetch(
         'https://jsonplaceholder.typicode.com/posts?_limit=10'
      );
      const data = await response.json();
      setPosts(data);
   } catch (error) {
      console.log(error);
   }
};
</code></pre><h2 id="come-utilizzare-le-api-con-axios"><strong>Come Utilizzare le API con Axios</strong></h2><p>Axios &nbsp;è una libreria HTTP client basata sulle promise che facilita l'invio di richieste asincrone HTTP verso endpoint REST. Nel nostro caso l'endpoint è l'API dei Post JSONPlaceholder, alla quale invieremo richieste <code>GET</code>, <code>POST</code>, e <code>DELETE</code>.</p><h3 id="come-installare-e-configurare-una-istanza-di-axios"><strong>Come Installare e Configurare una Istanza di Axios</strong></h3><p>Axios, al contrario dell'API Fetch, non è integrata, pertanto la dobbiamo includere nel nostro progetto per poterla usare.</p><p>Puoi aggiungere Axios al tuo progetto eseguendo il seguente comando:</p><pre><code class="language-js">npm install axios
</code></pre><p>Una volta installata con successo Axios, possiamo procedere alla creazione di una istanza, il che è opzionale ma consigliato in quanto ci risparmia inutili ripetizioni.</p><p>Per creare una istanza usiamo il metodo <code>.create()</code>, che possiamo utilizzare per specificare informazioni tipo l'URL e possibili header:</p><pre><code class="language-js">import axios from "axios";

const client = axios.create({
   baseURL: "https://jsonplaceholder.typicode.com/posts" 
});
</code></pre><h3 id="come-eseguire-una-richiesta-get-in-react-con-axios"><strong>Come Eseguire una Richiesta GET in React con Axios</strong></h3><p>Useremo l'istanza dichiarata in precedenza per eseguire una richiesta GET. Tutto quello che dovremo fare sarà impostare i parametri, se necessari, e ottenere una risposta JSON come formato predefinito.</p><p>Diversamente dal metodo dell'API Fetch, non sono necessarie opzioni per dichiarare il metodo. Semplicemente utilizziamo il tipo di richiesta come metodo dell'istanza ed eseguiamo la richiesta.</p><pre><code class="language-js">useEffect(() =&gt; {
   client.get('?_limit=10').then((response) =&gt; {
      setPosts(response.data);
   });
}, []);
</code></pre><h3 id="come-eseguire-una-richiesta-post-in-react-con-axios"><strong>Come Eseguire una Richiesta POST in React con Axios</strong></h3><p>Come detto prima, puoi usare il metodo &nbsp;<code>POST</code> per inviare dati a un endpoint. Funziona in modo simile alla richiesta <code>GET</code>, la principale differenza è che occorre chiamare il relativo metodo passando come parametro un oggetto contenente i dati che vogliamo inviare:</p><pre><code class="language-js">const addPosts = (title, body) =&gt; {
   client
      .post('', {
         title: title,
         body: body,
      })
      .then((response) =&gt; {
         setPosts((posts) =&gt; [response.data, ...posts]);
      });
};
</code></pre><h3 id="come-eseguire-una-richiesta-delete-in-react-con-axios"><strong>Come Eseguire una Richiesta DELETE in React con Axios</strong></h3><p>Possiamo eseguire richiese di cancellazione usando il metodo delete, che riceve un <code>id</code> ed elimina il post relativo dall'API. Useremo anche il metodo <code>filter</code> per eliminarlo anche dall'interfaccia utente, così come abbiamo fatto con il corrispondente metodo dell'API Fetch:</p><pre><code class="language-js">const deletePost = (id) =&gt; {
   client.delete(`${id}`);
   setPosts(
      posts.filter((post) =&gt; {
         return post.id !== id;
      })
   );
};
</code></pre><h3 id="come-usare-async-await-in-axios"><strong>Come Usare Async/Await in Axios</strong></h3><p>Fino a ora abbiamo visto come effettuare richieste Axios usando la sintassi di promise. Ora vediamo come possiamo usare async/await per scrivere meno codice ed evitare il concatenamento con <code>.then()</code>.</p><p>Quando usiamo async/await, tutte le nostre richieste Axios saranno così:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [title, setTitle] = useState('');
   const [body, setBody] = useState('');
   const [posts, setPosts] = useState([]);

   // GET with Axios
   useEffect(() =&gt; {
      const fetchPost = async () =&gt; {
         let response = await client.get('?_limit=10');
         setPosts(response.data);
      };
      fetchPost();
   }, []);

   // Delete with Axios
   const deletePost = async (id) =&gt; {
      await client.delete(`${id}`);
      setPosts(
         posts.filter((post) =&gt; {
            return post.id !== id;
         })
      );
   };

   // Post with Axios
   const addPosts = async (title, body) =&gt; {
      let response = await client.post('', {
         title: title,
         body: body,
      });
      setPosts((posts) =&gt; [response.data, ...posts]);
   };

   const handleSubmit = (e) =&gt; {
      e.preventDefault();
      addPosts(title, body);
   };

   return (
      // ...
   );
};

export default App;
</code></pre><h3 id="come-gestire-errori-con-axios"><strong>Come Gestire Errori con Axios</strong></h3><p>Per le richieste Axios basate su promise possiamo usare i metodi <code>.then()</code> e <code>.catch()</code>, mentre per async/await possiamo usare il blocco <code>try...catch</code>. È molto simile a come abbiamo implementato l'API Fetch, e il blocco <code>try...catch</code> è scritto in questo modo:</p><pre><code class="language-js">const fetchPost = async () =&gt; {
   try {
      let response = await client.get('?_limit=10');
      setPosts(response.data);
   } catch (error) {
      console.log(error);
   }
};
</code></pre><p>Puoi trovare ulteriori informazioni sulla gestione degli errori con Axios <a href="https://www.freecodecamp.org/italian/news/p/c6c9310b-73a4-47a2-9a0e-8541917a7d7e/Puoi%20leggere%20ulteriori%20informazioni%20sugli%20errori%20dell'API%20di%20recupero%20qui">qui</a></p><h2 id="api-fetch-contro-axios"><strong>API Fetch Contro Axios</strong></h2><p>Potresti aver notato alcune differenze, ora le metteremo in una pratica tabella in modo da confrontare correttamente &nbsp;Fetch e Axios.</p><p>Queste distinzioni ti aiuteranno a decidere quale libreria utilizzare per un progetto specifico. Tra queste distinzioni ci sono:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>AXIOS</th>
<th>FETCH</th>
</tr>
</thead>
<tbody>
<tr>
<td>Axios è un pacchetto a sé stante di terze parti semplice da installare.</td>
<td>Fetch è integrato nella maggior parte dei browser più moderni. <strong>Non è richiesta installazione</strong>.</td>
</tr>
<tr>
<td>Axios usa la proprietà <strong>data</strong>.</td>
<td>Fetch usa la proprietà <strong>body</strong>.</td>
</tr>
<tr>
<td>I dati da Axios contengono l'<strong>oggetto</strong>.</td>
<td>Il contenuto della proprietà body di Fetch deve essere <strong>convertito in stringa</strong>.</td>
</tr>
<tr>
<td>Quando <code>status</code> è 200 <code>statusText</code> è 'OK,' la richiesta Axios risulta accettata.</td>
<td>La richiesta Fetch viene accettata quando <strong>l'oggetto in risposta contiene la proprietà <code>ok</code></strong>.</td>
</tr>
<tr>
<td>Axios esegue una <strong>conversione dei dati in JSON automaticamente</strong>.</td>
<td>Fetch ha un <strong>processo a due fasi</strong> per gestire i dati JSON- prima si esegue l'effettiva richiesta; poi si chiama il metodo <code>.json()</code> sulla risposta.</td>
</tr>
<tr>
<td>Axios consente la <strong>cancellazione e il timeout della richiesta</strong></td>
<td>Fetch no</td>
</tr>
<tr>
<td>Axios ha <strong>supporto integrato per l'avanzamento del download</strong>.</td>
<td>Fetch non supporta l'avanzamento del download.</td>
</tr>
<tr>
<td>Axios è ha un <strong>ampio supporto per i browser</strong>.</td>
<td>Fetch è compatibile solo con Chrome 42+, Firefox 39+, Edge 14+, e Safari 10.1+ (ciò è noto come retrocompatibilità).</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questa guida, abbiamo imparato come utilizzare le API REST in React usando l'API Fetch oppure Axios.</p><p>Ti aiuterà a iniziare a usare le API in React e da lì, sarai in grado di utilizzare i dati in modi più complessi e manipolare le tue API come preferisci.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
