Recupera i dati da un'API REST in un'applicazione DOM virtuale Oracle JET
Introduzione
Questa esercitazione descrive come accedere a un servizio REST, integrarlo nell'applicazione DOM virtuale Oracle JavaScript Extension Toolkit (Oracle JET) e associare i dati a una vista elenco nell'interfaccia utente.
Obiettivi
In questa esercitazione verrà descritto come creare le istanze della classe RESTDataProvider. Questa classe rappresenta i dati disponibili dai servizi REST basati su JSON.
Prerequisiti
- Ambiente di sviluppo impostato per creare applicazioni DOM virtuali Oracle JET che include un'installazione di Node.js
- (Opzione 1) Completamento dell'esercitazione finale nel percorso di apprendimento precedente di questa serie: Gestione degli eventi di selezione in un'applicazione DOM virtuale di Oracle JET
- (Opzione 2) Se il percorso di apprendimento precedente non è stato completato in questa serie, scaricare jet-virtual-dom-app-temp.zip
Task 1: Scarica l'app Starter Virtual DOM
Saltare questo task se si continua a lavorare in un'applicazione creata nel percorso di apprendimento precedente.
-
Rinominare
jet-virtual-dom-app-temp.zipcomeJET-Virtual-DOM-app.zip. Estrarre il contenuto nella directoryJET-Virtual-DOM-app. -
Passare alla directory
JET-Virtual-DOM-appe ripristinare l'applicazione Oracle JET Virtual DOM.npm installL'applicazione DOM virtuale è pronta per l'uso.
Task 2: Accesso al servizio REST
Fare clic sul collegamento APEX per visualizzare i dati REST per l'endpoint della risorsa Attività.
I dati contengono un elenco di attività con vari attributi.
{
"items": [
{
"id": 1,
"name": "Baseball",
"short_desc": "Equipment we carry for baseball players.",
"image": "css/images/product_images/baseball.jpg"
},
. . .
],
"hasMore": false,
"limit": 25,
"offset": 0,
"count": 4,
"links": [
{
"rel": "self",
"href": "https://apex.oracle.com/pls/apex/oraclejet/lp/activities/"
},
. . .
]
}
Familiarizzare con i dati e le proprietà restituite dall'endpoint. È necessario comprendere questi dettagli quando si crea un'istanza di RESTDataProvider più avanti in questa esercitazione. Si noti, ad esempio, come l'endpoint restituisce una proprietà items che fa riferimento a una serie di singole attività.
Task 3: Creare un provider di dati per recuperare i dati dell'attività
-
Passare alla directory
JET-Virtual-DOM-app/src/components/e aprire il fileParentContainer1.tsxin un editor. -
All'inizio del file
ParentContainer1.tsx, importare il moduloRESTDataProvidered eliminare o commentare le istruzioni di importazione per il moduloMutableArrayDataProvidere il filestore_data.json.Importiamo anche l'hook
useMemoche utilizzeremo durante la creazione diRESTDataProviderin un secondo momento.import { h } from "preact"; . . . // import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); // import * as storeData from "text!./store_data.json"; import { RESTDataProvider } from "ojs/ojrestdataprovider"; import { useState, useMemo } from "preact/hooks"; . . . -
Creare una variabile
keyattributese una variabilerestServerURLActivitiesche faccia riferimento all'attributo chiave attività e all'endpoint REST che si passerà all'istanzaRESTDataProviderche si creerà nel passo successivo.let keyAttributes: string = 'id'; // REST endpoint that returns Activity data const restServerURLActivities: string = 'https://apex.oracle.com/pls/apex/oraclejet/lp/activities/'; -
Creare una nuova variabile
activityDataProviderche faccia riferimento al moduloRESTDataProvidered eliminare o commentare la variabileactivityDataProviderpreesistente che fa riferimento al moduloMutableArrayDataProvider.Creiamo la nuova variabile
activityDataProviderall'interno della funzioneParentContainer1e la avvolgiamo all'interno di un hookuseMemoper garantire che l'istanza del provider di dati venga ricreata solo se i dati nel provider di dati cambiano effettivamente.const ParentContainer1 = () => { const activityDataProvider = useMemo(() => new RESTDataProvider<Activity["id"], Activity>({ keyAttributes: keyAttributes, url: restServerURLActivities, transforms: { fetchFirst: { request: async (options) => { const url = new URL(options.url); const { size, offset } = options.fetchParameters; url.searchParams.set("limit", String(size)); url.searchParams.set("offset", String(offset)); return new Request(url.href); }, response: async ({ body }) => { const { items, totalSize, hasMore } = body; return { data: items, totalSize, hasMore }; }, }, }, }), []) . . .Nota: la funzione
responsesopra riportata che estrae dati e altre proprietà dal corpo della risposta dell'endpoint deve restituire un oggetto con una proprietàdata. Poiché l'endpoint con cui lavoriamo restituisce una proprietàitems, questa proprietà viene assegnata adatanella funzione di risposta. -
Salvare il file
ParentContainer1.tsx.Il file
ParentContainer1.tsxdeve avere un aspetto simile a quello del file ParentContainer1-a.tsx.txt. -
Passare alla directory
JET-Virtual-DOM-app/src/components/Activitye aprire il fileActivityContainer.tsxin un editor. -
All'inizio del file
ActivityContainer.tsx, importare il moduloRESTDataProvidere commentare o eliminare l'istruzione di importazione per il moduloMutableArrayDataProvider.import { h, ComponentProps } from "preact"; . . . // import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); import { RESTDataProvider } from "ojs/ojrestdataprovider"; . . . -
Nell'alias di tipo
Props, modificare la proprietà facoltativadataper fare riferimento al tipoRESTDataProvideranziché al tipoMutableArrayDataProvider<Activity["id"], Activity>preesistente.type Props = { data?: RESTDataProvider<Activity["id"], Activity>; // data?: MutableArrayDataProvider<Activity["id"], Activity>; . . . }; -
Salvare il file
ActivityContainer.tsx.Il file
ActivityContainer.tsxdeve essere simile a ActivityContainer.tsx.txt.
Task 4: Aggiungere un handler errori per gestire un errore durante il recupero dei dati
L'istanza RESTDataProvider fornisce un'opzione di errore che è possibile utilizzare per richiamare una funzione di callback quando un tentativo di recupero dei dati non riesce. Questa funzionalità verrà implementata per lo scenario in cui un tentativo di recupero della lista di attività non riesce.
-
Nel file
ParentContainer1.tsxdella directoryJET-Virtual-DOM-app/src/components/, importare l'hookuseRefda Preact.. . . import { RESTDataProvider } from "ojs/ojrestdataprovider"; import { useState, useMemo, useRef } from "preact/hooks"; . . . -
Nella variabile
activityDataProviderche fa riferimento aRESTDataProvideraggiungere l'opzioneerrore un riferimento alla funzione di callback che richiama (fetchErrorHandler).const ParentContainer1 = () => { const activityDataProvider = useMemo(() => new RESTDataProvider<Activity["id"], Activity>({ keyAttributes: keyAttributes, url: restServerURLActivities, error: fetchErrorHandler, transforms: { . . . -
Prima della variabile
activityDataProvider, aggiungere il codice perfetchErrorHandlere gli hook (useStateeuseRef) utilizzati per determinare se il tentativo di recuperare i dati è riuscito.. . . const ParentContainer1 = () => { const [fetchStatus, setFetchStatus] = useState(true); const fetchError = useRef<string>(); const fetchErrorHandler = (errorDetail: RESTDataProvider.FetchErrorDetail<number, Activity> | RESTDataProvider.FetchResponseErrorDetail<number, Activity>) => { setFetchStatus(false); if (errorDetail.hasOwnProperty('response')) { fetchError.current = `${(errorDetail as RESTDataProvider.FetchResponseErrorDetail<number, Activity>).response.status}`; } else { fetchError.current = (errorDetail as RESTDataProvider.FetchErrorDetail<number, Activity>).error.message; } } const activityDataProvider = new RESTDataProvider<Activity["id"], Activity>({ . . . -
Nell'istruzione return alla fine del file
ParentContainer1.tsx, aggiungere un controllo che determina se visualizzare la lista di attività o un messaggio nel caso in cui il tentativo di recupero dei dati non sia riuscito.. . . return ( <div> {fetchStatus ? ( <div id="parentContainer1" class="oj-flex oj-flex-init"> <ActivityContainer data={activityDataProvider} onActivityChanged={activityChangedHandler} /> {showActivityItems() && (<ParentContainer2 activity={selectedActivity} />)} {!showActivityItems() && (<h4 class="oj-typography-subheading-sm">Select activity to view items</h4>)} </div>) : (<p>Sorry that we couldn't get your product information right now. Please contact your system administrator.</p> )} </div> ); }; export default ParentContainer1; -
Salvare il file
ParentContainer1.tsx.Il file
ParentContainer1.tsxdeve avere un aspetto simile a quello del file ParentContainer1-b.tsx.txt.
Task 5: Creare un provider di dati per recuperare i dati degli elementi
Utilizzare un'altra istanza RESTDataProvider per recuperare un subset dei dati, ovvero la lista di elementi per una determinata attività. A tale scopo, specificare un nuovo URL contenente l'ID attività selezionato.
-
Passare alla directory
JET-Virtual-DOM-app/src/components/e aprire il fileParentContainer2.tsxin un editor. -
All'inizio del file
ParentContainer2.tsx, importare il moduloRESTDataProvidered eliminare o commentare le istruzioni di importazione per il moduloMutableArrayDataProvidere il filestore_data.json. Importare anche l'interfacciaTextFilterche verrà utilizzata quando si abilita la funzionalità di filtro nell'istanzaRESTDataProvidercreata.import { h } from "preact"; . . . import { RESTDataProvider } from "ojs/ojrestdataprovider"; import { TextFilter } from "ojs/ojdataprovider"; // import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); // import * as storeData from "text!./store_data.json"; . . . -
Dopo l'alias di tipo
Item, creare una variabilebaseServiceUrlper fare riferimento all'endpoint REST che verrà passato all'istanza diRESTDataProviderche verrà creata nel passo successivo.type Item = { . . . }; const baseServiceUrl = "https://apex.oracle.com/pls/apex/oraclejet/lp/activities/"; -
Creare un'istanza iniziale di
RESTDataProviderche verrà passata nei passi successivi agli hook diuseStateeuseEffectPreact.const baseServiceUrl = 'https://apex.oracle.com/pls/apex/oraclejet/lp/activities/'; let INIT_DATAPROVIDER = new RESTDataProvider<ActivityItem['id'], ActivityItem>({ keyAttributes: 'id', url: baseServiceUrl, transforms: { fetchFirst: { request: null!, response: (): any => { return { data: [] }; }, }, }, }); -
Commentare o eliminare il codice preesistente che ha creato una variabile per leggere i dati dal file
store_data.jsone che ha creato un'istanza iniziale diMutableArrayDataProvider.// const activityData = JSON.parse(storeData); // let activityItemsArray = activityData[0].items; // // Create data provider instance for the array of activity items for the selected activity // const INIT_DATAPROVIDER = new MutableArrayDataProvider<ActivityItem["id"], ActivityItem>(activityItemsArray, { // keyAttributes: "id", // }) -
Nella funzione
ParentContainer2sostituire l'hookuseEffectesistente che gestisce l'istanza diMutableArrayDataProvidercon una nuova definizione che crea unRESTDataProviderper gli elementi attività che corrispondono all'ID attività selezionato. Questa nuova definizione include anche un filtro di testo per filtrare il camponamedell'elemento attività.const ParentContainer2 = (props: Props) => { . . . useEffect(() => { setactivityItemDP( new RESTDataProvider<ActivityItem["id"], ActivityItem>({ keyAttributes: "id", capabilities: { filter: { textFilter: true, }, }, url: baseServiceUrl + "/" + props.activity?.id + "/items/", textFilterAttributes: ["name"], transforms: { fetchFirst: { request: async (options) => { const url = new URL(options.url); const { size, offset } = options.fetchParameters; url.searchParams.set("limit", String(size)); url.searchParams.set("offset", String(offset)); const filterCriterion = options.fetchParameters .filterCriterion as TextFilter<Item>; const { textFilterAttributes } = options.fetchOptions; if ( filterCriterion && filterCriterion.text && textFilterAttributes ) { const { text } = filterCriterion; textFilterAttributes.forEach((attribute) => { url.searchParams.set(attribute, text); }); } return new Request(url.href); }, response: async ({ body }) => { const { items, totalSize, hasMore } = body; return { data: items, totalSize, hasMore }; }, }, }, }) ); }, [props.activity]); return ( . . . -
Salvare il file
ParentContainer2.tsx.Il file
ParentContainer2.tsxdeve essere simile al file ParentContainer2.tsx.txt. -
Passare alla directory
JET-Virtual-DOM-app/src/components/ActivityIteme aprire il fileActivityItemContainer.tsxin un editor. -
All'inizio del file
ActivityItemContainer.tsx, importare il moduloRESTDataProvidere commentare o eliminare l'istruzione di importazione per il moduloMutableArrayDataProvider.import { h, ComponentProps } from "preact"; . . . // import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); import { RESTDataProvider } from "ojs/ojrestdataprovider"; . . . -
Nell'alias di tipo
Props, modificare la proprietàdatain modo che faccia riferimento al tipoRESTDataProvideranziché al tipoMutableArrayDataProvider<Activity["id"], Activity>preesistente.type Props = { // data?: MutableArrayDataProvider<ActivityItem["id"], ActivityItem>; data?: RESTDataProvider<ActivityItem['id'], ActivityItem>; selectedActivity: Item | null; onItemChanged: (item: Item) => void; }; -
Salvare il file
ActivityItemContainer.tsx.Il file
ActivityItemContainer.tsxdeve essere simile a ActivityItemContainer.tsx.txt.
Task 6: Test dell'applicazione DOM virtuale
-
Nella finestra del terminale, passare alla directory
JET-Virtual-DOM-apped eseguire l'applicazione DOM virtuale.npx ojet serve -
Nella finestra del browser, visualizza le modifiche dinamiche nella tua applicazione DOM virtuale.

-
Chiudere la finestra o la scheda del browser che visualizza l'applicazione DOM virtuale in esecuzione.
-
Nella finestra del terminale, premere Ctrl+C e, se richiesto, immettere
yper uscire dal job batch degli strumenti Oracle JET. -
Nella finestra del terminale, eseguire l'applicazione DOM virtuale utilizzando i seguenti argomenti aggiuntivi della riga di comando.
npx ojet serve --server-port=8144 --livereload-port=8145In questa occasione, l'applicazione DOM virtuale visualizza il seguente messaggio perché il servizio REST di cui si è fidato per accedere accetta solo le richieste sulla porta del server che il comando
ojet serveutilizza per impostazione predefinita (8000), pertanto il tentativo da parte di RESTDataProvider di recuperare dal servizio REST non è riuscito.Sorry that we couldn't get your product information right now. Please contact your system administrator.
Passo successivo
Passare all'esercitazione successiva in questo modulo.
Questa esercitazione fa parte del modulo Operazioni CRUD mediante un servizio REST.
- Recupera dati dall'API REST in Oracle JET
- Creare un form per creare record di dati in un'applicazione Oracle JET Virtual DOM
- Aggiorna record dati in un'applicazione Oracle JET Virtual DOM
- Elimina record dati in un'applicazione Oracle JET Virtual DOM
Puoi tornare alla pagina principale del percorso di apprendimento DOM virtuale per accedere a tutti i moduli sulla creazione di app DOM virtuali.
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.
Per la documentazione del prodotto, visitare Oracle Help Center.
Fetch data from a REST API in an Oracle JET virtual DOM app
F70668-02