Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questa esercitazione si apprenderà come connettere un database di server singolo o flessibile di Database di Azure per PostgreSQL all'app Web statica. Dopo la configurazione, è possibile effettuare richieste REST o GraphQL all'endpoint predefinito /data-api per manipolare i dati senza la necessità di scrivere codice back-end.
Per semplicità, questa esercitazione illustra come usare un database di Azure a scopo di sviluppo locale, ma è anche possibile usare un server di database locale per le esigenze di sviluppo locali.
Note
Questa esercitazione illustra come usare un server singolo o flessibile di Database di Azure per PostgreSQL. Per usare un altro database, vedere le esercitazioni su Azure Cosmos DB, Azure SQL o MySQL .
In questa esercitazione si apprenderà come:
- Collegare un database di server flessibile o singolo di Database di Azure per PostgreSQL alla propria app Web statica
- Creare, leggere, aggiornare ed eliminare dati
Prerequisiti
Per completare questa esercitazione, è necessario disporre di un server flessibile o singolo di Database di Azure per PostgreSQL esistente e di un'app Web statica. È anche necessario installare Visual Studio Code.
| Risorsa | Descrizione |
|---|---|
| Server flessibile di Database di Azure per PostgreSQL o Database di server singolo di Database di Azure per PostgreSQL | Se non ne è già disponibile uno, seguire la procedura descritta nella guida per creare un database di server flessibile di Database di Azure per PostgreSQL o nella guida per creare un database di server singolo di Database di Azure per PostgreSQL. Se si prevede di usare un'autenticazione basata su stringa di connessione per le connessioni al database di App Web statiche, creare il server di Database di Azure per PostgreSQL con l'autenticazione PostgreSQL. È possibile modificare questo valore se in seguito si desidera usare l'identità gestita. |
| App Web statica esistente | Se non è già disponibile, seguire la procedura descritta nella guida introduttiva per creare un'app Web statica senza framework. |
| Visual Studio Code, con l'estensione PostgreSQL | Se Visual Studio Code non è già installato, seguire la guida per installare Visual Studio Code con l'estensione PostgreSQL. In alternativa, è possibile usare qualsiasi altro strumento per eseguire query sul database PostgreSQL, ad esempio PgAdmin. |
Per iniziare, configurare il database in modo che si possa usare con la funzionalità di connessione al database di App Web statiche di Azure.
Configurare la conettività del database
App Web statiche di Azure deve disporre dell'accesso di rete al database per consentire il funzionamento delle connessioni al database. Per usare un database di Azure per lo sviluppo locale, è inoltre necessario configurare il database in modo da consentire le richieste provenienti dal proprio indirizzo IP.
Andare al server di Database di Azure per PostgreSQL nel portale di Azure.
Se si usa il server flessibile di Database di Azure per PostgreSQL, nella sezione Impostazioni selezionare Rete. Se si usa il server singolo di Database di Azure per PostgreSQL, nella sezione Impostazioni selezionare Sicurezza connessione.
Nella sezione Regole del firewall selezionare il pulsante Aggiungi l'indirizzo IP cliente corrente. Questo passaggio garantisce che sia possibile usare il database per lo sviluppo locale.
Nella sezione Regole del firewall selezionare la casella di controllo Consenti l'accesso pubblico da qualsiasi servizio di Azure all'interno di Azure a questo server. Se si usa il server singolo di Database di Azure per PostgreSQL, questa opzione è contrassegnata con l'etichetta Consenti l'accesso ai servizi di Azure. Questo passaggio garantisce che la risorsa App Web statiche distribuita possa accedere al database.
Selezionare Salva.
Ottenere la stringa di connessione al database per lo sviluppo locale
Per usare il database di Azure per lo sviluppo locale, è necessario recuperare la stringa di connessione del database. È possibile ignorare questo passaggio se si prevede di usare un database locale a scopo di sviluppo.
Andare al server di Database di Azure per PostgreSQL nel portale di Azure.
Nella sezione Impostazioni selezionare Stringhe di connessione.
Nella casella ADO.NET copiare la stringa di connessione e salvarla in un editor di testo.
Sostituire il segnaposto
{your_password}nella stringa di connessione con la propria password.Sostituire il segnaposto
{your_database}con il nome del databaseMyTestPersonDatabase. Il databaseMyTestPersonDatabaseverrà creato nei passaggi successivi.Aggiungere
Trust Server Certificate=True;alla stringa di connessione in modo da usarla per lo sviluppo locale.
Creare dati di esempio
Creare una tabella di esempio e popolarla con i dati di esempio in modo che corrispondano all'esercitazione. Questa esercitazione usa Visual Studio Code, ma è possibile usare PgAdmin o qualsiasi altro strumento.
In Visual Studio Code crea una connessione al Database di Azure per il server PostgreSQL
Fare clic con il pulsante destro del mouse sul server, quindi selezionare Nuova query. Eseguire la query seguente per creare un database denominato
MyTestPersonDatabase.CREATE DATABASE "MyTestPersonDatabase";Fare clic con il pulsante destro del mouse sul server, quindi scegliere Aggiorna.
Fare clic con il pulsante destro del mouse su
MyTestPersonDatabase, quindi selezionare Nuova query. Eseguire la query seguente per creare una nuova tabella denominataMyTestPersonTable.CREATE TABLE "MyTestPersonTable" ( "Id" SERIAL PRIMARY KEY, "Name" VARCHAR(25) NULL );Eseguire le query seguenti per aggiungere dati nella tabella MyTestPersonTable .
INSERT INTO "MyTestPersonTable" ("Name") VALUES ('Sunny'); INSERT INTO "MyTestPersonTable" ("Name") VALUES ('Dheeraj');
Configurare l'app Web statica
La parte restante di questa esercitazione è incentrata sulla modifica del codice sorgente dell'app Web statica per l'uso delle connessioni al database in locale.
Importante
I passaggi seguenti presuppongono che sia in uso l'app Web statica creata nella guida introduttiva. Se si usa un progetto diverso, assicurarsi di modificare i comandi git seguenti in modo che corrispondano ai nomi dei rami.
Passare al ramo
main.git checkout mainSincronizzare la versione locale con gli elementi in GitHub usando
git pull.git pull origin main
Creare il file di configurazione del database
Creare quindi il file di configurazione usato dall'app Web statica per interagire con il database.
Aprire il terminale e creare una nuova variabile per contenere la stringa di connessione. La sintassi specifica può variare a seconda del tipo di shell in uso.
export DATABASE_CONNECTION_STRING='<YOUR_CONNECTION_STRING>'Sostituire
<YOUR_CONNECTION_STRING>con il valore della stringa di connessione impostato in un editor di testo.Usare npm per installare o aggiornare l'interfaccia della riga di comando di App Web statiche. Selezionare il comando più adatto per la situazione.
Per l'installazione, usare
npm install.npm install -g @azure/static-web-apps-clinpm install -g @azure/static-web-apps-cliPer l'aggiornamento, usare
npm update.npm updatenpm updateUsare il comando
swa db initper generare un file di configurazione del database.swa db init --database-type postgresqlIl comando
initcrea il file staticwebapp.database.config.json nella cartella swa-db-connections.Incollare questo esempio nel file staticwebapp.database.config.json generato.
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "postgresql",
"options": {
"set-session-context": false
},
"connection-string": "@env('DATABASE_CONNECTION_STRING')"
},
"runtime": {
"rest": {
"enabled": true,
"path": "/rest"
},
"graphql": {
"allow-introspection": true,
"enabled": true,
"path": "/graphql"
},
"host": {
"mode": "production",
"cors": {
"origins": ["http://localhost:4280"],
"allow-credentials": false
},
"authentication": {
"provider": "StaticWebApps"
}
}
},
"entities": {
"Person": {
"source": "MyTestPersonTable",
"permissions": [
{
"actions": ["*"],
"role": "anonymous"
}
]
}
}
}
Prima di andare al passaggio successivo, esaminare la tabella seguente che illustra i diversi aspetti del file di configurazione. Per la documentazione completa sul file di configurazione e sulle funzionalità, ad esempio relazioni e criteri per la sicurezza a livello di elemento, vedere la documentazione del generatore di API dati.
| Funzionalità | Spiegazione |
|---|---|
| Connessione al database | In fase di sviluppo, il runtime legge la stringa di connessione dal valore della stringa di connessione nel file di configurazione. Sebbene sia possibile specificare la stringa di connessione direttamente nel file di configurazione, è consigliabile archiviare stringa di connessione in una variabile di ambiente locale. Per fare riferimento ai valori delle variabili di ambiente nel file di configurazione, è possibile usare la notazione @env('DATABASE_CONNECTION_STRING'). Il valore della stringa di connessione viene sovrascritto da App Web statiche per il sito distribuito con le informazioni raccolte quando si connette il database. |
| Endpoint API | L'endpoint REST è disponibile tramite /data-api/rest, mentre l'endpoint GraphQL è disponibile tramite /data-api/graphql, come specificato in questo file di configurazione. È possibile configurare i percorsi REST e GraphQL, ma il prefisso /data-api non è configurabile. |
| Sicurezza API | Le impostazioni runtime.host.cors permettono di definire le origini consentite che possono effettuare richieste all'API. In questo caso, la configurazione riflette un ambiente di sviluppo e consente il percorso http://localhost:4280. |
| Modello di entità | Definisce le entità esposte tramite route nell'API REST o come tipi nello schema GraphQL. In questo caso, il nome Person è il nome esposto all'endpoint, mentre entities.<NAME>.source è lo schema del database e il mapping delle tabelle. Si noti che non è necessario che il nome dell'endpoint API sia uguale al nome della tabella. |
| Sicurezza dell'entità | Le regole delle autorizzazioni elencate nella matrice entity.<NAME>.permissions controllano le impostazioni di autorizzazione per un'entità. È possibile proteggere un'entità con ruoli nello stesso modo in cui si proteggono le route con i ruoli. |
Note
le proprietà connection-string, host.mode e graphql.allow-introspection del file di configurazione vengono sovrascritte quando si distribuisce il sito. La stringa di connessione viene sovrascritta con i dettagli di autenticazione raccolti quando si connette il database alla risorsa App Web statiche. La proprietà host.mode è impostata su production, mentre la proprietà graphql.allow-introspection è impostata su false. Tali sostituzioni garantiscono coerenza nei file di configurazione nei carichi di lavoro di sviluppo e produzione, assicurando al tempo stesso che la risorsa App Web statiche con connessioni al database abilitate sia sicura e pronta per la produzione.
Dopo aver configurato l'app Web statica per connettersi al database, è ora possibile verificare la connessione.
Aggiornare la home page
Sostituire il markup tra i tag body nel file index.html con il codice HTML seguente.
<h1>Static Web Apps Database Connections</h1>
<blockquote>
Open the console in the browser developer tools to see the API responses.
</blockquote>
<div>
<button id="list" onclick="list()">List</button>
<button id="get" onclick="get()">Get</button>
<button id="update" onclick="update()">Update</button>
<button id="create" onclick="create()">Create</button>
<button id="delete" onclick="del()">Delete</button>
</div>
<script>
// add JavaScript here
</script>
Avviare l'applicazione in locale
È ora possibile eseguire il sito Web e manipolare direttamente i dati nel database.
Avviare l'app Web statica con la configurazione del database.
swa start --data-api-location swa-db-connections
Ora che l'interfaccia della riga di comando è stata avviata, è possibile accedere al database tramite gli endpoint definiti nel file staticwebapp.database.config.json.
L'endpoint http://localhost:4280/data-api/rest/<ENTITY_NAME> accetta le richieste GET, PUT, POST e DELETE per manipolare i dati nel database.
L'endpoint http://localhost:4280/data-api/graphql accetta query e mutazioni GraphQL.
Manipolare i dati
I comandi indipendenti dal framework seguenti illustrano come eseguire operazioni CRUD complete nel database.
L'output per ogni funzione viene visualizzato nella finestra della console del browser.
Premere CMD/CTRL + SHIFT + I per aprire gli strumenti di sviluppo, quindi selezionare la scheda Console.
Elencare tutti gli elementi
Aggiungere il codice seguente tra i tag script in index.html.
async function list() {
const endpoint = '/data-api/rest/Person';
const response = await fetch(endpoint);
const data = await response.json();
console.table(data.value);
}
In questo esempio:
- La richiesta predefinita per l'API
fetchusa il verboGET. - I dati nel payload della risposta si trovano nella proprietà
value.
async function list() {
const query = `
{
people {
items {
Id
Name
}
}
}`;
const endpoint = "/data-api/graphql";
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query: query })
});
const result = await response.json();
console.table(result.data.people.items);
}
In questo esempio:
- La query GraphQL seleziona i campi
IdeNamedal database. - La richiesta passata al server richiede un payload in cui la proprietà
querycontiene la definizione della query. - I dati nel payload della risposta si trovano nella proprietà
data.people.items.
Aggiornare la pagina e selezionare il pulsante Elenca .
La finestra della console del browser visualizza ora una tabella che elenca tutti i record nel database.
| ID | Nome |
|---|---|
| 1 | Sunny |
| 2 | Dheeraj |
Ecco uno screenshot di cosa dovrebbe apparire nel browser.
Recuperare per ID
Aggiungere il codice seguente tra i tag script in index.html.
async function get() {
const id = 1;
const endpoint = `/data-api/rest/Person/Id`;
const response = await fetch(`${endpoint}/${id}`);
const result = await response.json();
console.table(result.value);
}
In questo esempio:
- L'endpoint ha il suffisso
/person/Id. - Il valore ID viene aggiunto alla fine del percorso dell'endpoint.
- I dati nel payload della risposta si trovano nella proprietà
value.
async function get() {
const id = 1;
const gql = `
query getById($id: Int!) {
person_by_pk(Id: $id) {
Id
Name
}
}`;
const query = {
query: gql,
variables: {
id: id,
},
};
const endpoint = "/data-api/graphql";
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(query),
});
const result = await response.json();
console.table(result.data.person_by_pk);
}
In questo esempio:
- La query GraphQL seleziona i campi
IdeNamedal database. - La richiesta passata al server richiede un payload in cui la proprietà
querycontiene la definizione della query. - I dati nel payload della risposta si trovano nella proprietà
data.person_by_pk.
Aggiornare la pagina e selezionare il pulsante Ottieni .
La finestra della console del browser visualizza ora una tabella che elenca il singolo record richiesto dal database.
| ID | Nome |
|---|---|
| 1 | Sunny |
Aggiornamento
Aggiungere il codice seguente tra i tag script in index.html.
La funzione App Web statiche supporta entrambi i verbi PUT e PATCH. Una richiesta PUT aggiorna l'intero record, mentre PATCH esegue un aggiornamento parziale.
async function update() {
const id = 1;
const data = {
Name: "Molly"
};
const endpoint = '/data-api/rest/Person/Id';
const response = await fetch(`${endpoint}/${id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data)
});
const result = await response.json();
console.table(result.value);
}
In questo esempio:
- L'endpoint ha il suffisso
/person/Id/. - Il valore ID viene aggiunto alla fine del percorso dell'endpoint.
- Il verbo REST è
PUTper aggiornare il record del database. - I dati nel payload della risposta si trovano nella proprietà
value.
async function update() {
const id = 1;
const data = {
Name: "Molly"
};
const gql = `
mutation update($id: Int!, $item: UpdatePersonInput!) {
updatePerson(Id: $id, item: $item) {
Id
Name
}
}`;
const query = {
query: gql,
variables: {
id: id,
item: data
}
};
const endpoint = "/data-api/graphql";
const res = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(query)
});
const result = await res.json();
console.table(result.data.updatePerson);
}
In questo esempio:
- La query GraphQL seleziona i campi
IdeNamedal database. - L'oggetto
querycontiene la query GraphQL nella proprietàquery. - I valori dell'argomento per la funzione GraphQL vengono passati tramite la proprietà
query.variables. - La richiesta passata al server richiede un payload in cui la proprietà
querycontiene la definizione della query. - I dati nel payload della risposta si trovano nella proprietà
data.updatePerson.
Aggiornare la pagina e selezionare il pulsante Aggiorna .
La finestra della console del browser visualizza ora una tabella che mostra i dati aggiornati.
| ID | Nome |
|---|---|
| 1 | Molly |
Create
Aggiungere il codice seguente tra i tag script in index.html.
async function create() {
const data = {
Name: "Pedro"
};
const endpoint = `/data-api/rest/Person/`;
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data)
});
const result = await response.json();
console.table(result.value);
}
In questo esempio:
- L'endpoint ha il suffisso
/person/. - Il verbo REST è
POSTper aggiungere un record di database. - I dati nel payload della risposta si trovano nella proprietà
value.
async function create() {
const data = {
Name: "Pedro"
};
const gql = `
mutation create($item: CreatePersonInput!) {
createPerson(item: $item) {
Id
Name
}
}`;
const query = {
query: gql,
variables: {
item: data
}
};
const endpoint = "/data-api/graphql";
const result = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(query)
});
const response = await result.json();
console.table(response.data.createPerson);
}
In questo esempio:
- La query GraphQL seleziona i campi
IdeNamedal database. - L'oggetto
querycontiene la query GraphQL nella proprietàquery. - I valori dell'argomento per la funzione GraphQL vengono passati tramite la proprietà
query.variables. - La richiesta passata al server richiede un payload in cui la proprietà
querycontiene la definizione della query. - I dati nel payload della risposta si trovano nella proprietà
data.updatePerson.
Aggiornare la pagina e selezionare il pulsante Crea .
La finestra della console del browser visualizza ora una tabella che mostra il nuovo record nel database.
| ID | Nome |
|---|---|
| 3 | Pedro |
Delete
Aggiungere il codice seguente tra i tag script in index.html.
async function del() {
const id = 3;
const endpoint = '/data-api/rest/Person/Id';
const response = await fetch(`${endpoint}/${id}`, {
method: "DELETE"
});
if(response.ok) {
console.log(`Record deleted: ${ id }`)
} else {
console.log(response);
}
}
In questo esempio:
- L'endpoint ha il suffisso
/person/Id/. - Il valore ID viene aggiunto alla fine del percorso dell'endpoint.
- Il verbo REST è
DELETEper rimuovere il record del database. - Se l'eliminazione ha esito positivo, la proprietà
okdel payload della risposta ètrue.
async function del() {
const id = 3;
const gql = `
mutation del($id: Int!) {
deletePerson(Id: $id) {
Id
}
}`;
const query = {
query: gql,
variables: {
id: id
}
};
const endpoint = "/data-api/graphql";
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(query)
});
const result = await response.json();
console.log(`Record deleted: ${ result.data.deletePerson.Id }`);
}
In questo esempio:
- La query GraphQL seleziona il campo
Iddal database. - L'oggetto
querycontiene la query GraphQL nella proprietàquery. - I valori dell'argomento per la funzione GraphQL vengono passati tramite la proprietà
query.variables. - La richiesta passata al server richiede un payload in cui la proprietà
querycontiene la definizione della query. - I dati nel payload della risposta si trovano nella proprietà
data.deletePerson.
Aggiornare la pagina e selezionare il pulsante Elimina .
La finestra della console del browser visualizza ora una tabella che mostra la risposta alla richiesta di eliminazione.
Record eliminati: 3
Dopo aver usato il sito in locale, è possibile distribuirlo in Azure.
Distribuire il sito
Per distribuire il sito nell'ambiente di produzione, è sufficiente eseguire il commit del file di configurazione e il push delle modifiche nel server.
Aggiungere le modifiche apportate al file per tenerne traccia.
git add .Eseguire il commit delle modifiche di configurazione.
git commit -am "Add database configuration"Eseguire il push delle modifiche nel server.
git push origin main
Connettere il database all'app Web statica
Usare la procedura seguente per creare una connessione tra l'istanza di App Web statiche del sito e il database.
Aprire l'app Web statica nel portale di Azure.
Nella sezione Impostazioni selezionare Connessione database.
Nella sezione Produzione selezionare il collegamento Collega database esistente.
Nella finestra Collega database esistente immettere i valori seguenti:
Proprietà valore Tipo di database Selezionare il tipo di database nell'elenco a discesa. Subscription Selezionare la sottoscrizione di Azure nell'elenco a discesa. Nome risorsa Selezionare il nome del server di database del database desiderato. Nome database Selezionare il nome del database da collegare all'app Web statica. Tipo di autenticazione Selezionare Stringa di connessione e immettere il nome utente e la password per PostgreSQL. Per il server singolo PostgreSQL, non includere il suffisso @servername.Selezionare OK.
Verificare che il database sia connesso alla risorsa App Web statiche
Dopo aver connesso il database all'app Web statica e aver completato la compilazione del sito, seguire questa procedura per verificare la connessione al database.
Aprire l'app Web statica nel portale di Azure.
Nella sezione Informazioni di base selezionare l'URL della risorsa App Web statiche per spostarsi nell'app Web statica.
Selezionare il pulsante Elenca per elencare tutti gli elementi.
L'output deve essere simile a quello mostrato in questo screenshot.
Pulire le risorse
Per rimuovere le risorse create durante l'esercitazione, è necessario scollegare il database e rimuovere i dati di esempio.
Scollega database: aprire l'app Web statica nel portale di Azure. Nella sezione Impostazioni selezionare Connessione database. Accanto al database collegato, selezionare Visualizza dettagli. Nella finestra Dettagli connessione database, selezionare il pulsante Scollega.
Rimuovere i dati di esempio: nel database, eliminare la tabella denominata
MyTestPersonTable.