Condividi tramite


Creare connettori dati avanzati (anteprima)

[Questo articolo fa parte della documentazione non definitiva, pertanto è soggetto a modifiche.]

Quando i dati da usare con il connettore sono strutturati con tabelle o elenchi, il protocollo del connettore avanzato consente di offrire più facilmente connettori di livello aziendale a prestazioni elevate. I connettori avanzati fungono da potente origine delle conoscenze per gli agenti e consentono di creare facilmente app canvas in Power Apps e comporre la logica usando Power Automate.

Importante

  • Si tratta di una funzionalità di anteprima.
  • Le funzionalità di anteprima non sono destinate ad essere utilizzate per la produzione e sono soggette a restrizioni. Queste funzionalità sono soggette a condizioni per l'utilizzo supplementari e sono disponibili prima di una versione ufficiale in modo che i clienti possano ottenere l'accesso iniziale e fornire feedback.

Azioni e connettori avanzati

I connettori creati usando endpoint OpenAPI (swagger) sono considerati connettori di azione. OpenAPI offre un formato standardizzato per descrivere le API HTTP di qualsiasi dimensione. Consente di definire in modo esplicito gli endpoint (percorsi), i metodi HTTP supportati e gli schemi di richiesta/risposta. Ogni operazione (una combinazione di percorso e metodo) rappresenta un'azione chiamabile specifica dell'API, adatta alle API che seguono i principi RESTful.

Per le origini dati strutturate , il controllo OpenAPI con granularità fine diventa oneroso perché le origini dati tabulari in genere non sono definite da un endpoint OpenAPI. La definizione OpenAPI non è associata ai metadati che descrivono i dati strutturati, quindi non si adatta alle modifiche che aggiungono nuove tabelle, colonne o relazioni a un'origine dati. Il connettore generato usando la definizione OpenAPI statica non può rappresentare queste modifiche fino a quando non viene rigenerato.

I connettori avanzati richiedono un endpoint che fornisce informazioni che descrivono un set dinamico di tabelle, schemi e funzionalità. Questo articolo descrive un protocollo che è possibile implementare per creare un'API Web ASP.NET Core basata su un protocollo simile a OData anziché OpenAPI. Questo protocollo è progettato per i dati tabulari e usa le funzionalità OData per gestire filtri, ordinamento, paging e relazioni non forniti da OpenAPI.

Annotazioni

L'endpoint descritto in questo articolo presenta alcune analogie con OData, ma non implementa il protocollo OData effettivo.

Dati strutturati

Cosa si intende per dati strutturati? I dati possono essere strutturati usando tabelle di database effettive, ma possono anche usare terminologia diversa, ad esempio "site" anziché "database" e "list" anziché "table". Il punto chiave è che i dati sono strutturati in una gerarchia di risorse simile alla seguente:

  • Un set di dati espone una raccolta di tabelle
  • Una tabella contiene righe e colonne contenenti dati
  • Un elemento rappresenta una riga di una tabella

Connettori che usano questo modello

Di seguito sono riportati alcuni dei connettori avanzati che usano questo modello:

Apache Impala

DB2

Come funziona

Il protocollo del connettore avanzato include tre parti principali:

  • Endpoint delle capacità: Descrivere i set di dati, le tabelle e le colonne a cui il connettore può accedere e le operazioni che possono eseguire.
  • Transpiler: converte le richieste di stile GET OData per recuperare dati dalla fonte dati. Queste richieste usano opzioni di query OData come $filter, $select$orderby, $sort, e$top
  • Implementazione dell'operazione CUD: descrive come eseguire operazioni di creazione, aggiornamento ed eliminazione sulle risorse per l'origine dati

A livello generale, è necessario implementare il processo seguente:

  1. Creare un'API Web di ASP.NET Core che implementa il protocollo del connettore avanzato.
  2. Distribuire il progetto API Web di ASP.NET Core nell'ambiente di hosting preferito.
  3. Creare il connettore personalizzato usando lo strumento da riga di comando paconn.
  4. Configurare l'autenticazione.
  5. Condividere e testare il connettore.

Annotazioni

L'esempio di connettore avanzato di Power Fx è una soluzione di Visual Studio pubblicata in GitHub. È possibile clonare il repository e usare il progetto dell'API Web principale di ASP.NET fornito come punto di partenza per l'endpoint.

Endpoint delle funzionalità

Il protocollo del connettore avanzato dipende dall'implementazione di cinque endpoint che descrivono le funzionalità del servizio. La tabella seguente riepiloga questi endpoint e include collegamenti alle sezioni di questo documento che illustrano come implementarle.

Itinerario Come
GET $metadata.json/datasets Restituisce un elenco di set di dati
GET /datasets Restituire i nomi dei set di dati
GET /datasets/{dataset}/tables Restituire i nomi delle tabelle
GET $metadata.json/datasets/{dataset}/tables/{tableName} Restituire le funzionalità di una tabella
GET /datasets/{dataset}/tables/{tableName}/items Recuperare i valori delle colonne della tabella

Interfaccia ITableProvider

Le interfacce ITableProviderFactory e ITableProvider seguenti forniscono i metodi previsti per implementare gli endpoint delle capacità del protocollo avanzato del connettore. Aggiungere il codice seguente all'interno della Services cartella del progetto API Web core di ASP.NET.

// Helper to get a provider for a given auth token. 
public interface ITableProviderFactory
{
    ITableProvider Get(IReadOnlyDictionary<string, string> settings);
}

/// <summary>
/// Datasource Provider. Host implements this to provide the RecordTypes for a specific source.
/// </summary>
public interface ITableProvider
{
    // Return list of datasets (logical name, display name)
    public Task<DatasetResponse.Item[]> GetDatasetsAsync(
      CancellationToken cancellationToken = default
      );

    // Provider list of the tables.
    public Task<GetTablesResponse> GetTablesAsync(
      string dataset, 
      CancellationToken cancellationToken = default);

    public Task<RecordType> GetTableAsync(
      string dataset, 
      string tableName, 
      CancellationToken cancellationToken = default);

    public Task<TableValue> GetTableValueAsync(
      string dataset, 
      string tableName, 
      CancellationToken cancellationToken = default);
}

Implementare l'API Web ASP.NET Core con una separazione tra front-end (API REST) e back-end (provider di origine dati). Il back-end viene astratto tramite l'interfaccia ITableProvider , che è possibile implementare per connettersi a qualsiasi origine dati tabulare.

Classi usate

Nell'applicazione API Web principale ASP.NET creata aggiungere i pacchetti NuGet Microsoft.PowerFx.Connectors e Microsoft.PowerFx.Core in modo da avere accesso ai tipi usati in ITableProvider, ad esempio RecordType e TableValue

Alcuni altri tipi necessari non sono attualmente inclusi nei pacchetti NuGet di PowerFx. Trovali all'interno del campione del connettore migliorato Power Fx nella cartella power-fx-enhanced-connector/CdpHelpers/Protocol usando lo stesso spazio dei nomi Microsoft.PowerFx.Connectors. Vedere la tabella che descrive questi tipi.

Restituisce un elenco di set di dati

Questo endpoint nel servizio fornisce un catalogo leggero e in formato JSON di tutti i contenitori di dati di primo livello, come si potrebbe pensare in SQL come in esecuzione SELECT name FROM sys.databases. Recuperando solo i nomi e gli URL di accesso di ogni set di dati, i client possono individuare in modo dinamico le unità logiche (database) esposte dal servizio senza codificare gli identificatori. Questa progettazione non solo guida i flussi di lavoro di un’interfaccia utente o di generazione del codice basati sui metadati—consentendo agli utenti di selezionare un set di dati e quindi di approfondire nelle sue tabelle o viste—ma rispetta anche le regole di autorizzazione visualizzando solo i set di dati che il chiamante è autorizzato a vedere.

Implementare questa route nel controller per fornire dati sui set di dati disponibili:

GET $metadata.json/datasets

Annotazioni

Questa route non è inclusa nell'interfaccia ITableProvider .

Restituire un'istanza datasetMetadata con le proprietà seguenti:

Nome TIPO Description
DatasetFormat String Descrive il formato della stringa del set di dati. Ad esempio per SQL, può essere "{server},{database}"
IsDoubleEncoding Boolean Indica se il BLOB di metadati viene codificato due volte (ad esempio, un payload JSON di cui è stato eseguito il wrapping come stringa con codifica JSON), richiedendo due passaggi di decodifica per recuperare i metadati non elaborati.
Parametri IReadOnlyCollection<MetadataParameter> Consultare MetadataParameter
Tabellare Metadati Tabulari Vedere MetadataTabular

Annotazioni

Nell'esempio di connettore avanzato Power Fx, CdpSampleWebApi/Controllers/CdpController.csDatasetMetadata viene rinominato in DatasetMetadataResponse. Questo nome sarà coerente con i nomi usati nell'interfaccia ITableProvider se fosse incluso.

MetadataParameter

Questi metadati descrivono come le applicazioni client devono raccogliere, convalidare e codificare ogni parametro di query quando si chiama l'endpoint del set di dati. Impostando queste proprietà, assicurarsi di:

  • Le interfacce utente possono visualizzare etichette chiare e tooltip per ogni parametro.
  • I campi obbligatori vengono applicati in fase di progettazione, impedendo gli errori di runtime.
  • I valori di input vengono convalidati rispetto al tipo dichiarato (stringa, integer, booleano e così via).
  • La codifica URL viene applicata correttamente in modo che i caratteri speciali non interrompano la richiesta.

Impostare la proprietà DatasetMetadata.Parameters con un'istanza MetadataParameter che contiene queste proprietà:

Nome TIPO Description
Descrizione String Spiegazione leggibile di ciò che questo parametro rappresenta e di come influisce sulla richiesta del set di dati. Ad esempio, questo valore è il nome del server o il nome del database nel contesto SQL.
Nome String Il nome esatto del parametro che i client devono includere nella stringa di query o nel corpo della richiesta.
Required String Indica se il client deve fornire questo parametro. Se true, omettendo il parametro si verifica un errore; se false, può essere applicato un comportamento predefinito o di fallback.
Tipo String Tipo di dati del valore del parametro, ad esempio string, integerboolean, , che indica ai client come convalidare e convertire l'input prima di inviare la richiesta.
UrlEncoding String Specifica se il valore del parametro deve essere codificato in URL una volta (single) o due volte (double).
XMsDynamicValues MetadataDynamicValues Vedere MetadataDynamicValues
XMsSummary String Riepilogo conciso usato nei tooltip o nella documentazione dell'interfaccia utente per aiutare gli utenti a comprendere a colpo d'occhio lo scopo di questo parametro.

MetadataDynamicValues

Questi metadati indicano alle applicazioni client come recuperare ed eseguire il rendering di un elenco attivo di opzioni valide per uno specifico parametro, abilitando elenchi a discesa, selettori o esperienze di ricerca in tempo reale nell'interfaccia utente. Impostando queste proprietà, assicurarsi di:

  • I client conoscono l'endpoint o il percorso da chiamare per recuperare l'elenco corrente di valori
  • Il payload della risposta viene analizzato correttamente per estrarre sia i valori sottostanti che i relativi titoli di visualizzazione
  • Gli input dei parametri rimangono sincronizzati con le opzioni disponibili del servizio, riducendo gli errori e migliorando l'esperienza utente

Quando si imposta l'insieme DatasetMetadata.Parameters, impostare la proprietà XMsDynamicValues su un'istanza MetadataDynamicValues. Questa classe ha le proprietà stringa seguenti:

Nome Description
Percorso L'URL relativo o il percorso OData che i client chiamano per ottenere l'elenco dei valori dinamici (ad esempio: /datasets/{dataset name}/tables).
ValueCollection Nome della proprietà JSON nel payload della risposta che contiene la matrice di elementi (ad esempio: value o items).
ValuePath Percorso JSON (relativo a ogni elemento) per estrarre il valore effettivo del parametro (ad esempio: id o name.value).
ValueTitle Percorso JSON (relativo a ogni elemento) per estrarre il testo visualizzato rivolto all'utente per ogni opzione (ad esempio: displayName o title).

MetadataTabular

Questi metadati indicano al codice client come presentare e accedere ai dati tabulari del servizio. Impostando queste proprietà, assicurarsi che le interfacce utente visualizzino la terminologia e generino correttamente gli URL per il back-end specifico. Ad esempio, un servizio basato su SQL usa Table/Tables, mentre un connettore SharePoint usa List/Listse le impostazioni di codifica URL appropriate garantiscono che i percorsi delle risorse vengano compilati correttamente.

Impostare la proprietà DatasetMetadata.Tabular con un'istanza MetadataTabular che contiene queste proprietà stringa:

Nome Description
DisplayName Nome di visualizzazione per il dataset. Ad esempio, Database/WebSite.
Fonte Può essere mru o singleton. Se il servizio ha un solo contenitore di dati logici, /datasets diventa effettivamente un endpoint singleton. In uno scenario multi-set di dati, è comunque possibile non sovraccaricare i client con ogni set di dati possibile contemporaneamente. È invece possibile tenere traccia della cronologia di utilizzo e restituire /datasets solo i primi N set di dati ordinati in base all'ora dell'ultimo accesso (o all'ultima modifica). In questo modo gli utenti vedono in primo piano gli elementi usati più di recente (mru) e possono successivamente navigare un elenco completo o abilitare la paginazione, se hanno bisogno di più.
TableDisplayName Nome visualizzato della tabella, ad esempio l'origine dati, ad esempio 'Table' o 'List'.
TablePluralName Nome plurale della tabella, come nei datasource, ad esempio "Tabelle" o "Elenchi".
UrlEncoding Può essere single o double.

Restituire i nomi dei set di dati

Implementare questa route nel controller per fornire una raccolta di nomi per ogni set di dati:

GET /datasets

Implementare il metodo ITableProvider.GetDatasetsAsync per restituire un'istanza di DatasetResponse che ha una proprietà value con un array di istanze Item.

Ogni Item ha proprietà stringa Name e DisplayName.

Annotazioni

I connettori non sono necessari per fornire più set di dati. Quando è presente un solo set di dati, la convenzione consiste nell'impostare le Name proprietà e DisplayName del singolo elemento su default.

Restituire i nomi delle tabelle

Implementare questa route nel controller per fornire una raccolta di nomi per le tabelle in un set di dati:

GET /datasets/{dataset}/tables

Implementare il ITableProvider.GetTablesAsync metodo per restituire un'istanza getTablesResponse . Questa classe dispone di una Value proprietà che restituisce un oggetto List<RawTablePoco>.

RawTablePoco ha le due proprietà stringa: Name e DisplayName.

Annotazioni

'POCO' è l'acronimo di 'Plain Old CLR Objects' e viene usato come modo per formattare i dati di risposta in ASP.NET API Web core.

Restituire le funzionalità di una tabella

Implementare questa route nel controller per restituire dati sulle funzionalità delle tabelle in un set di dati:

GET $metadata.json/datasets/{dataset}/tables/{tableName}

Implementare il metodo ITableProvider.GetTableAsync per restituire un RecordType e quindi convertire tale valore in GetTableResponse. Il metodo RecordType.ToTableResponse fornisce un esempio che mostra come. È necessario aggiungere il file CdpHelpers/RecordTypeExtensions.cs al progetto per usarlo.

GetTableResponse ha le proprietà seguenti:

Nome TIPO Description
capabilities CapabilitiesPoco Ottiene o imposta le funzionalità della tabella, ad esempio il supporto di filtri e ordinamento. Vedere Descrivere le funzionalità delle tabelle
name String Ottiene o imposta il nome della tabella.
permissions String Ottiene o imposta le autorizzazioni per la tabella, ad esempio "lettura/scrittura".
schema TableSchemaPoco Ottiene o imposta lo schema della tabella. Vedere Descrivere le funzionalità delle colonne della tabella

Descrivere le funzionalità della tabella

La GetTableResponse.capabilities proprietà descrive le funzionalità di una tabella usando la classe CapabilitiesPoco .

La CapabilitiesPoco classe ha le proprietà seguenti per descrivere le funzionalità di una tabella.

Nome TIPO Description
filterFunctionSupport string[] Ottiene o imposta le funzioni di filtro supportate, ad esempio eq, and, or.
filterRestrictions Filter La Filter classe dispone di una proprietà booleana filterable per descrivere se la tabella supporta o meno alcun filtro. Se filterable è true, la nonFilterableProperties proprietà contiene una matrice di nomi di colonna di tabella che non sono filtrabili.
isOnlyServerPagable bool Ottiene o imposta un valore che indica se la tabella è visualizzabile solo per il server.
odataVersion int Ottiene o imposta la versione OData, ad esempio: 3.
serverPagingOptions string[] Ottiene o imposta le opzioni di paging del server, ad esempio , topskiptoken.
sortRestrictions Sort La Sort classe dispone di una proprietà booleana sortable per descrivere se la tabella supporta o meno qualsiasi ordinamento. Se sortable è true, la unsortableProperties proprietà contiene una matrice di nomi di colonna di tabella che non sono ordinabili.

Descrivere le funzionalità delle colonne di tabella

La GetTableResponse.schema proprietà descrive le funzionalità delle colonne di tabella usando la classe TableSchemaPoco .

Annotazioni

In questa sezione viene descritto un set di classi con proprietà semplici e complesse. Le proprietà con tipo complesso creano una gerarchia che descrive le funzionalità delle colonne per una tabella.

TableSchemaPoco.items
 Items.properties
  ColumnInfo.capabilities
   ColumnCapabilitiesPoco

La TableSchemaPoco classe ha le proprietà seguenti per descrivere le funzionalità di una tabella.

Nome TIPO Description
type corda Ottiene o imposta il tipo dello schema (il valore predefinito è "array").
items Elementi Ottiene o imposta la definizione degli elementi, che descrive le colonne della tabella.

La classe Items ha le proprietà seguenti:

Nome TIPO Description
type corda Ottiene o imposta il tipo degli elementi (il valore predefinito è "object").
properties Dizionario<string,ColumnInfo> Ottiene o imposta il dizionario delle proprietà delle colonne, indicizzato per nome della colonna.

La classe ColumnInfo ha le proprietà seguenti:

Nome TIPO Description
title corda Ottiene o imposta il titolo della colonna.
description corda Ottiene o imposta la descrizione della colonna.
type corda Ottiene o imposta il tipo della colonna, ad esempio , integerstring.
sort corda Ottiene o imposta le funzionalità di ordinamento per la colonna, ad esempio , ascdesc.
capabilities ColumnCapabilitiesPoco Ottiene o imposta le funzionalità di filtro per la colonna.

La classe ColumnCapabilitiesPoco ha le proprietà seguenti:

Nome TIPO Description
filterFunctions string[] Ottiene o imposta le funzioni di filtro supportate per la colonna, ad esempio eq, and, or.

Recuperare i valori delle colonne della tabella

Implementare questa route nel controller per restituire i valori delle colonne della tabella:

GET /datasets/{dataset}/tables/{tableName}/items

Implementare il ITableProvider.GetTableValueAsync metodo per restituire un oggetto TableValue e successivamente convertire tale valore in GetItemsResponse

GetItemsResponse ha una sola proprietà value, che è un List<Dictionary<string, object>> contenente le chiavi e i valori per le rispettive proprietà della tabella.

Transpiler

L'API Web di base ASP.NET creata deve consentire agli utenti di specificare parametri facoltativi della stringa di query OData quando viene usata questa route:

GET /datasets/{dataset}/tables/{tableName}/items

Il servizio deve supportare le funzionalità annunciate per la tabella e le colonne.

CdpSampleWebApi/Services/ODataQueryModel.cs è un contenitore di associazione di modelli leggero per un subset di opzioni di query di sistema OData. Il suo scopo:

  • Associazione di modelli: ASP.NET popola automaticamente le relative proprietà dai parametri della stringa di query denominati $select, $filter, $tope $orderby grazie agli [FromQuery(Name="...")] attributi . Ad esempio: /entities?$select=id,name&$top=10.

  • Solo acquisizione non elaborata: non analizza o convalida le espressioni OData; conserva il testo fornito dal client in modo che il codice downstream (ad esempio, un livello dati o un inoltro a un'altra API) possa decidere come interpretare, convalidare o inoltrarli.

  • Creazione di pacchetti condizionali: ToStrDict() converte solo i valori forniti (e $top solo se > 0) in un dizionario, utile per:

    • Ricostruire o inoltrare le stesse opzioni di query OData a un altro servizio.
    • Registrazione/controllo.
    • Compilazione di una stringa di query a livello di codice.
  • Scelte di denominazione/maiuscole/minuscole: top e orderby sono minuscole per rispecchiare esattamente senza alterazioni le parole chiave OData (avvisi di stile/analizzatore soppressi all'inizio del file). Selezionare e filtrare utilizzano PascalCase (stile misto), ma l'associazione funziona ancora grazie all'override esplicito del Nome.

  • Ambito: omette intenzionalmente altre opzioni OData ($skip, $expand,$count, $searche altre), mantenendo la superficie minima. Potenziali miglioramenti (se necessario):

    • Rendere nullable top (int?) per distinguere tra "absent" e "explicit 0".
    • Aggiungere $skip, $expando altri parametri di query man mano che aumentano i requisiti.
    • Aggiungere la convalida o l'analisi (ad esempio: approvare i campi in $select, analisi delle espressioni per $filter).
    • Normalizzare la denominazione delle proprietà per la coerenza.

In breve, la classe ODataQueryModel è un semplice veicolo pass-through di opzioni di query OData selezionate, consentendo un accesso sicuro, chiaro e verificabile a tali opzioni all'interno delle azioni o dei servizi del controller.

Creare, aggiornare ed eliminare l'implementazione dell'operazione

Come si può notare, il protocollo del connettore avanzato descrive modi specifici per recuperare informazioni sulle funzionalità dei set di dati e recuperare i dati. La fase successiva consiste nel fornire funzionalità per aggiungere, modificare o rimuovere righe di tabella.

Creazione di righe

Il servizio deve usare il POST metodo HTTP con lo stesso percorso di risorsa usato per recuperare i record. Il payload viene inviato con il corpo della richiesta.

POST /datasets/{dataset}/tables/{tableName}/items

Aggiornamento ed eliminazione di righe

L'aggiornamento o l'eliminazione di righe richiede un modo per identificare il record da modificare o rimuovere. Questo dipende dalla natura dell'origine dati, ma è consigliabile usare gli stessi percorsi delle risorse. Per modificare un record, usare PATCH.

PATCH /datasets/{dataset}/tables/{tableName}/items/{primary key}

Per eliminare un record, usare DELETE.

DELETE /datasets/{dataset}/tables/{tableName}/items/{primary key}

Limitazioni

Di seguito sono riportate le aree in cui le funzionalità di dati tabulari comuni non sono abilitate usando il protocollo di connessione dati tabulare.

Relationships

Non è attualmente possibile modellare le relazioni tra tabelle.

I tipi di dati sono limitati

Funzioneranno solo i tipi supportati da Swagger 2.0.

Passaggi successivi

Scopri l'esempio di connettore potenziato.