Nozioni di base su AWS

Realizza un'applicazione React full-stack

Crea una semplice applicazione Web utilizzando AWS Amplify

Modulo 4: Aggiunta di un'API GraphQL e di un database

In questo modulo verrà utilizzata l'interfaccia a riga di comando (CLI) di Amplify per configurare e aggiungere un'API GraphQL alla tua app.

Panoramica

Ora che abbiamo creato e configurato l'app con l'autenticazione, aggiungiamo un'API.

In questo modulo aggiungerai un'API alla tua app usando l'interfaccia a riga di comando (CLI) e le librerie di Amplify. L'API che creerai è un'API GraphQL che sfrutta AWS AppSync (un servizio GraphQL gestito) che è gestito da Amazon DynamoDB (un database NoSQL). (Per un'introduzione a GraphQL, consulta il sito Web di GraphQL.)

L'app che creeremo sarà un'app taccuino che consentirà agli utenti di creare, eliminare ed elencare appunti. Questo esempio ti darà una buona idea su come creare molti tipi famosi di applicazioni CRUD+L (crea, leggi, aggiorna, elimina ed elenca).

Obiettivi

In questo modulo completerai le seguenti operazioni:
  • Creazione e distribuzione di un'API GraphQL
  • Scrittura di un codice front-end per interagire con l'API

Concetti chiave

API: fornisce un'interfaccia di programmazione che consente la comunicazione e le interazioni tra più intermediari software.

GraphQL: un linguaggio di query e un'implementazione API lato server basati su una rappresentazione tipizzata dell'applicazione. Questa rappresentazione API viene dichiarata usando uno schema basato sul tipo di sistema GraphQL.

 Tempo per il completamento

15 minuti

 Servizi utilizzati

Implementazione

  • a. Aggiungi un'API GraphQL alla tua app emettendo il seguente comando dalla cartella root della directory dell'app:

    amplify add api
    
    ? Select from one of the below mentioned services: GraphQL
    ? Here is the GraphQL API that we will create. Select a setting to edit or continue: Continue
    ? Choose a schema template: Single object with fields (e.g., "Todo" with ID, name, description)
    ? Do you want to edit the schema now? (Y/n) yes

    b. Apri lo schema GraphQL nel tuo editor di testo: /amplify/backend/api/<api_name>/schema.graphql.

    Aggiorna il file con il seguente schema:

    type Note @model @auth(rules: [ { allow: public } ] ){
      id: ID!
      name: String!
      description: String
    }

    c. Salva il file.

  • Ora che l'API è stata configurata localmente, è il momento di implementarla. Per farlo, esegui il comando push di Amplify:

    amplify push --y

    Questo servirà a tre cose:

    1. Creare l'API AWS AppSync
    2. Creare una tabella DynamoDB
    3. Creare le operazioni GraphQL locali in una cartella in src/graphql che possono essere usate per eseguire query sull'API

    Per visualizzare l'API GraphQL nel tuo account in qualsiasi momento, emetti il comando seguente e seleziona l'API GraphQL nel riquadro di navigazione a sinistra:

    amplify console api
    
    > Choose GraphQL
    

    Per visualizzare l'app Amplify nel tuo account in qualsiasi momento, esegui il seguente comando:

    amplify console
    ? Which site do you want to open? AWS console
  • Ora che il back-end è stato implementato, scriviamo del codice per consentire agli utenti di creare, elencare ed eliminare appunti.

    Aggiorna src/App.js con il seguente codice:

    import React, { useState, useEffect } from "react";
    import "./App.css";
    import "@aws-amplify/ui-react/styles.css";
    import { API } from "aws-amplify";
    import {
      Button,
      Flex,
      Heading,
      Text,
      TextField,
      View,
      withAuthenticator,
    } from "@aws-amplify/ui-react";
    import { listNotes } from "./graphql/queries";
    import {
      createNote as createNoteMutation,
      deleteNote as deleteNoteMutation,
    } from "./graphql/mutations";
    
    const App = ({ signOut }) => {
      const [notes, setNotes] = useState([]);
    
      useEffect(() => {
        fetchNotes();
      }, []);
    
      async function fetchNotes() {
        const apiData = await API.graphql({ query: listNotes });
        const notesFromAPI = apiData.data.listNotes.items;
        setNotes(notesFromAPI);
      }
    
      async function createNote(event) {
        event.preventDefault();
        const form = new FormData(event.target);
        const data = {
          name: form.get("name"),
          description: form.get("description"),
        };
        await API.graphql({
          query: createNoteMutation,
          variables: { input: data },
        });
        fetchNotes();
        event.target.reset();
      }
    
      async function deleteNote({ id }) {
        const newNotes = notes.filter((note) => note.id !== id);
        setNotes(newNotes);
        await API.graphql({
          query: deleteNoteMutation,
          variables: { input: { id } },
        });
      }
    
      return (
        <View className="App">
          <Heading level={1}>My Notes App</Heading>
          <View as="form" margin="3rem 0" onSubmit={createNote}>
            <Flex direction="row" justifyContent="center">
              <TextField
                name="name"
                placeholder="Note Name"
                label="Note Name"
                labelHidden
                variation="quiet"
                required
              />
              <TextField
                name="description"
                placeholder="Note Description"
                label="Note Description"
                labelHidden
                variation="quiet"
                required
              />
              <Button type="submit" variation="primary">
                Create Note
              </Button>
            </Flex>
          </View>
          <Heading level={2}>Current Notes</Heading>
          <View margin="3rem 0">
            {notes.map((note) => (
              <Flex
                key={note.id || note.name}
                direction="row"
                justifyContent="center"
                alignItems="center"
              >
                <Text as="strong" fontWeight={700}>
                  {note.name}
                </Text>
                <Text as="span">{note.description}</Text>
                <Button variation="link" onClick={() => deleteNote(note)}>
                  Delete note
                </Button>
              </Flex>
            ))}
          </View>
          <Button onClick={signOut}>Sign Out</Button>
        </View>
      );
    };
    
    export default withAuthenticator(App);

    La nostra app ha tre funzioni principali:

    1. fetchNotes: questa funzione usa la classe dell'API per inviare una query all'API GraphQL e recuperare un elenco di appunti.
    2. createNote: questa funzione utilizza anche la classe API per inviare una mutazione all'API GraphQL. La differenza principale è che in questa funzione stiamo passando le variabili necessarie per una mutazione GraphQL in modo da poter creare una nuova nota con i dati del modulo.
    3. deleteNote: come createNote, questa funzione invia una modifica GraphQL insieme ad alcune variabili, ma invece di creare una nota se ne elimina una.
  • Per testare l'app, esegui il comando di avvio:

    npm start

Conclusioni

Ora hai creato un'app taccuino. Usando AWS Amplify hai aggiunto un'API GraphQL e hai configurato le funzionalità di creazione, lettura ed eliminazione nella tua app. Nel prossimo modulo aggiungeremo un servizio di archiviazione alla tua app.

Questa pagina è stata utile?

Aggiungi storage