Utilizzo della composizione dei criteri

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

In questo argomento, imparerai a creare un mashup utilizzando la composizione dei criteri. La composizione dei criteri è un pattern proxy Apigee che ti consente di combinare i risultati di più backend i target in un'unica risposta utilizzando i criteri.

Per una panoramica generale sulla composizione delle norme, consulta "Lo schema di composizione delle norme" nel Libro di ricette sul proxy API modelli.

Scarica e prova il codice campione

Informazioni su questo esempio di libro di ricette

L'esempio di questo libro di ricette illustra un pattern proxy API chiamato composizione dei criteri. Questo pattern fornisce un modo (e ne esistono altri) per combinare i dati da più origini di backend. Più in generale, questo argomento mostra come le norme possono essere combinate e collegate tra loro per produrre il risultato desiderato. Per una panoramica generale di questo pattern e di altri modelli correlati, consulta Istruzioni sul proxy API modelli.

L'esempio discusso qui utilizza la composizione dei criteri per combinare i dati di questi due API pubbliche:

  • Il servizio Google Geocoding API: questa API converte gli indirizzi, ad esempio "1600 Amphitheatre Parkway, Mountain View, CA", in coordinate geografiche (come latitudine 37.423021 e longitudine -122.083739).
  • L'elevazione di Google API Questa API fornisce un'interfaccia semplice per eseguire query sui luoghi della Terra relativi all'altitudine e i dati di Google Cloud. In questo esempio, verranno utilizzate come input le coordinate restituite dall'API Geocoding in questa API.

Gli sviluppatori di app chiameranno questo proxy API con due parametri di query: un codice postale e un paese ID:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

La risposta è un oggetto JSON che include la posizione geocodificata (latitudine/longitudine) per il centro dell'area del codice postale fornita combinata con l'elevazione geocodificata in ogni località.

{  
   "ElevationResponse":{  
      "status":"OK",
      "result":{  
         "location":{  
            "lat":"39.7500713",
            "lng":"-74.1357407"
         },
         "elevation":"0.5045232",
         "resolution":"76.3516159"
      }
   }
}

Prima di iniziare

Se desideri leggere una breve panoramica del modello di composizione delle norme, consulta "Le norme pattern della composizione" nel Libro di ricette sul proxy API modelli.

Prima di esplorare questo esempio di libro di ricette, dovresti aver acquisito familiarità con queste nozioni fondamentali di base:

  • Quali sono i criteri e come collegarli ai proxy. Per una buona introduzione alle norme, consulta Che cos'è un ?.
  • La struttura di un flusso di proxy API, come spiegato in Configurazione dei flussi. I flussi ti consentono specificare la sequenza con cui i criteri vengono eseguiti da un proxy API. In questo esempio, vengono creati e aggiunti al flusso del proxy API.
  • Organizzazione di un progetto proxy API nel file system, come spiegato in Riferimento per la configurazione dei proxy API. L'argomento del libro di ricette illustra lo sviluppo locale (file basato sul sistema) rispetto allo sviluppo basato su cloud, per cui era possibile utilizzare l'interfaccia utente di gestione per sviluppare il proxy API.
  • Utilizzo della convalida delle chiavi API. Questa è la forma di sicurezza basata su app più semplice a per un'API. Per ulteriori informazioni, consulta API chiave. Puoi anche seguire la Guida di riferimento su un'API richiedendo le chiavi API.
  • Conoscenza pratica del linguaggio XML. In questo esempio, vengono creati il proxy API e i relativi con file XML che risiedono nel file system.

Se hai scaricato il codice campione, puoi individuare tutti i file descritti in nella cartella di esempio mashup-policy-cookbook. Le seguenti sezioni il codice campione in dettaglio.

Seguire il flusso

Prima di passare alle norme, diamo un'occhiata al flusso principale del nostro esempio. proxy API. Il flusso XML, mostrato di seguito, ci parla molto di questo proxy, dei criteri che e dove vengono chiamati questi criteri.

Nel download di esempio, puoi trovare questo XML nel file doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml.

<ProxyEndpoint name="default">
  <Flows>
    <Flow name="default">
      <Request>
            <!-- Generate request message for the Google Geocoding API -->
            <Step><Name>GenerateGeocodingRequest</Name></Step>
            <!-- Call the Google Geocoding API -->
            <Step><Name>ExecuteGeocodingRequest</Name></Step>
            <!-- Parse the response and set variables -->
            <Step><Name>ParseGeocodingResponse</Name></Step>
            <!-- Generate request message for the Google Elevation API -->
            <Step><Name>AssignElevationParameters</Name></Step>
      </Request>
      <Response>
            <!-- Parse the response message from the Elevation API -->
            <Step><Name>ParseElevationResponse</Name></Step>
            <!-- Generate the final JSON-formatted response with JavaScript -->
            <Step><Name>GenerateResponse</Name></Step>
      </Response>
    </Flow>
  </Flows>

  <HTTPProxyConnection>
    <!-- Add a base path to the ProxyEndpoint for URI pattern matching-->
    <BasePath>/policy-mashup-cookbook</BasePath>
    <!-- Listen on both HTTP and HTTPS endpoints -->
    <VirtualHost>default</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets -->
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Ecco un riepilogo degli elementi del flusso.

  • &lt;Request&gt; - La <Request> è composto da più elementi &lt;Step&gt; elementi. Ogni passaggio richiama una delle norme che creeremo attraverso le altre di questo argomento. Questi criteri riguardano la creazione di un messaggio di richiesta, l'invio durante l'analisi della risposta. Alla fine di questo argomento, conoscerai il ruolo di ciascuno di questi criteri.
  • &lt;Response&gt; - La <Response> include anche <Steps>. Questa procedura chiama anche i criteri responsabili dell'elaborazione del risposta dall'endpoint di destinazione (l'API Google Elevation).
  • &lt;HttpProxyConnection&gt;: questo elemento specifica i dettagli su la modalità di connessione delle app a questo proxy API, incluso il percorso <BasePath>, che specifica verrà chiamata questa API.
  • &lt;RouteRule&gt; - Questo elemento specifica cosa accade immediatamente. dopo l'elaborazione dei messaggi di richiesta in entrata. In questo caso, viene chiamato TargetEndpoint. Approfondiremo questo importante passaggio più avanti in questo argomento.

Creazione dei criteri

Le seguenti sezioni illustrano ciascuna delle norme che compongono questa composizione delle norme esempio.

Crea il primoAssignMessage norme

Il primo criterio AssignMessage, elencate di seguito, crea un messaggio di richiesta che verrà inviato a Google Geocoding completamente gestito di Google Cloud.

Iniziamo con il codice delle norme, dopodiché illustreremo i suoi elementi in modo più dettagliato. Nella download di esempio, puoi trovare questo XML nel file doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml.

<AssignMessage name="GenerateGeocodingRequest">
  <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
      <QueryParam name="region">{request.queryparam.country}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <!-- Set variables for use in the final response -->
  <AssignVariable>
    <Name>PostalCode</Name>
    <Ref>request.queryparam.postalcode</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

Di seguito è riportata una breve descrizione degli elementi che compongono queste norme. Puoi scoprire di più al riguardo nella sezione Assegna Criteri relativi ai messaggi.

  • <AssignMessage name>: assegna un nome al criterio. Il nome è utilizzata quando viene fatto riferimento al criterio in un flusso.
  • &lt;AssignTo&gt; - Crea una variabile con nome GeocodingRequest. Questa variabile incapsula l'oggetto di richiesta che verrà inviato al backend dal ServiceCallout.
  • &lt;QueryParams&gt; - Imposta i parametri di query richiesti dal parametro chiamata API backend. In questo caso, l'API Geocoding deve conoscere la posizione, ovvero espresso con un codice postale e un ID paese. L'utente dell'app fornisce queste informazioni e lo estraiamo qui. Il parametro sensor è richiesto dall'API e viene true o false e l'impostazione come hardcoded qui è false.
  • &lt;Verb&gt; - In questo caso, stiamo effettuando una semplice richiesta GET al tramite Google Cloud CLI o tramite l'API Compute Engine.
  • &lt;AssignVariable&gt;: queste variabili memorizzano i valori a cui passare all'API. In questo esempio, potrai accedere alle variabili in un secondo momento nella risposta restituiti al cliente.

Invia la richiesta con ServiceCallout

Il passaggio successivo nella sequenza di composizione della norma prevede la creazione di una norma ServiceCallout. La Il criterio ServiceCallout (elenco di seguito) invia l'oggetto della richiesta che abbiamo creato nella precedente criterio AttributionMessage al servizio Google Geocoding e salva il risultato chiamata GeocodingResponse.

Come prima, diamo un'occhiata al codice. Segue una spiegazione dettagliata. Puoi leggere scopri di più su queste norme in Callout di servizio . Nel download di esempio, puoi trovare questo XML nel file doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml.

<ServiceCallout name="ExecuteGeocodingRequest">
  <Request variable="GeocodingRequest"/>
  <Response>GeocodingResponse</Response>
  <HTTPTargetConnection>
    <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
  </HTTPTargetConnection>
</ServiceCallout>

Di seguito è riportata una breve descrizione degli elementi di questa norma.

  • &lt;ServiceCallout&gt; - Come per il criterio precedente, questo ha un .
  • <Richiedi variabile> - Questa è la variabile creata in il criterioAssignMessage. Incapsula la richiesta indirizzata all'API backend.
  • &lt;Response&gt; - Questo elemento nomina una variabile in cui la risposta viene archiviato. Come vedrai, gli attributi ExtractVariables accederanno a questa variabile in un secondo momento .
  • &lt;HTTPTargetConnection&gt; - Specifica l'URL di destinazione del backend tramite Google Cloud CLI o tramite l'API Compute Engine. In questo caso, specifichiamo che l'API restituisce una risposta in formato JSON.

Ora abbiamo due criteri, uno che specifica le informazioni di richiesta necessarie per utilizzare l'API backend (l'API Geocoding di Google) e la seconda che invia effettivamente la richiesta l'API backend. Dopodiché ci occuperemo della risposta.

Analizza la risposta con ExtractVariables

Il criterio ExtractVariables fornisce un semplice meccanismo per analizzare il contenuto dal un messaggio di risposta ottenuto da un criterio ServiceCallout. È possibile usare ExtractVariables per analizzare JSON o XML oppure per estrarre contenuti da percorsi URI, intestazioni HTTP, query parametri e parametri del modulo.

Ecco un elenco del criterio ExtractVariables. Puoi scoprire di più su questa norma in Estrai variabili . Nel download di esempio, puoi trovare questo XML nel file doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml.

<ExtractVariables name="ParseGeocodingResponse">
  <Source>GeocodingResponse</Source>
  <VariablePrefix>geocoderesponse</VariablePrefix>
  <JSONPayload>
    <Variable name="latitude">
       <JSONPath>$.results[0].geometry.location.lat</JSONPath>
    </Variable>
    <Variable name="longitude">
       <JSONPath>$.results[0].geometry.location.lng</JSONPath>
    </Variable>
  </JSONPayload>
</ExtractVariables>

Gli elementi chiave del criterio ExtractVariable sono:

  • <ExtractVariables name> - Anche in questo caso, il nome del criterio è utilizzato per fare riferimento al criterio quando viene usato in un flusso.
  • &lt;Source&gt; - Specifica la variabile di risposta che abbiamo creato in il criterio ServiceCallout. Questa è la variabile da cui il criterio estrae i dati.
  • &lt;VariablePrefix&gt; - Il prefisso della variabile specifica uno spazio dei nomi per ad altre variabili create in questo criterio. Il prefisso può essere qualsiasi nome, ad eccezione di quello riservato i nomi definiti dagli sviluppatori Edge predefinite.
  • &lt;JSONPayload&gt;: questo elemento recupera i dati di risposta che vengono di interesse per noi e li inserisce in variabili con nome. Infatti, l'API Geocoding restituisce molte più informazioni rispetto a latitudine e longitudine. Tuttavia, questi sono gli unici valori di cui abbiamo bisogno per questo esempio. Puoi vedere un rendering completo del file JSON restituito dall'API Geocoding nell'interfaccia utente documentazione. I valori di Geometria.location.lat e Geometria.location.lng sono semplicemente due dei molti campi nell'oggetto JSON restituito.

Potrebbe non essere ovvio, ma è importante vedere che ExtractVariables produce due variabili i cui nomi sono costituiti dal prefisso della variabile (codici geografici) e dal numero i nomi delle variabili specificati nel criterio. Queste variabili vengono memorizzate proxy API e sarà disponibile per altri criteri all'interno del flusso di proxy, come vedere. Le variabili sono:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

La maggior parte del lavoro è ormai fatta. Abbiamo creato tre norme che formano un richiesta, chiamare un'API backend e analizzare i dati JSON restituiti. Negli ultimi passaggi, di dati da questa parte del flusso a un altro criterioAssignMessage, chiama il secondo backend API (API Google Elevation) e restituire i dati combinati allo sviluppatore dell'app.

Genera il secondo richiesta conAssignMessage

Il seguente criterio AssegnaMessage utilizza variabili restituite dal primo backend (Google Geocoding) che abbiamo archiviato e li collega a una richiesta destinata alla seconda API (Google elevazione). Come indicato in precedenza, queste variabili sono Geographicresponse.latitude e geocoderesponse.longitude.

Nel download di esempio, puoi trovare questo XML nel file doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml.

<AssignMessage name="AssignElevationParameters">
<Remove>
    <QueryParams>
      <QueryParam name="country"/>
      <QueryParam name="postalcode"/>
    </QueryParams>
  </Remove>
  <Set>
    <QueryParams>
      <QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Se esamini l'API Google Elevation, vedrai che richiede due parametri di query. Il primo si chiama locations e il suo valore sono la latitudine e la longitudine (valori separati da virgole). L'altro parametro è sensor, che è obbligatorio e deve true o false. La cosa più importante da notare a questo punto è che la richiesta che creiamo qui non richiede ServiceCallout. Non è necessario chiamare il secondo API da un ServiceCallout a questo punto perché possiamo chiamare l'API backend dal Endpoint di destinazione. A pensarci bene, abbiamo tutti i dati necessari per chiamare il programma Google Elevations API Il messaggio di richiesta generato in questo passaggio non richiede un ServiceCallout, poiché generata per la pipeline di richiesta principale, quindi verrà inoltrata semplicemente ProxyEndpoint al TargetEndpoint, seguendo la RouteRule configurata per questo proxy API. TargetEndpoint gestisce la connessione con l'API remota. Ricorda che l'URL relativo l'API elevazione è definita nella HTTPConnection per TargetEndpoint. API Elevation documentazione se vuoi saperne di più. I parametri QueryParam archiviati in precedenza, country e postalcode non sono più necessari, perciò li rimuoviamo qui.

Breve pausa: torna al flusso

A questo punto, potresti chiederti perché non stiamo creando un'altra norma ServiceCallout. Dopo il giorno tutti, abbiamo creato un altro messaggio. In che modo il messaggio viene inviato alla destinazione, l'account Google API Elevation? La risposta è nella regola <RouteRule> elemento del flusso. &lt;RouteRule&gt; specifica cosa fare con gli eventuali messaggi di richiesta rimanenti dopo il tag <Request> parte di eseguito il flusso. Il TargetEndpoint specificato da questa <RouteRule> indica Proxy API per la consegna del messaggio a http://maps.googleapis.com/maps/api/elevation/xml.

Se hai scaricato il proxy API di esempio, puoi trovare il file XML TargetProxy nel file doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml.

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <!-- This is where we define the target. For this sample we just use a simple URL. -->
    <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Ora dobbiamo solo elaborare la risposta dell'API Google Elevation e fatto.

Converti la risposta da XML in JSON

In questo esempio, la risposta dell'API Google Elevation viene restituita in formato XML. Per "extra credito", aggiungiamo un altro criterio al nostro composito per trasformare la risposta da XML a JSON.

In questo esempio viene utilizzato il criterio JavaScript denominato CreateResponse, con un file di risorse contenente il codice JavaScript, per eseguire la conversione. La figura seguente mostra la definizione del criterio CreateResponse:

<Javascript name="GenerateResponse" timeout="10000">
  <ResourceURL>jsc://GenerateResponse.js</ResourceURL>
</Javascript>

Il file di risorse generativeResponse.js include il codice JavaScript utilizzato per eseguire e conversione in blocco. Puoi vedere questo codice nel file doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

Apigee fornisce anche un criterio pronto all'uso, XMLToJSON, per convertire i file XML in JSON. Puoi modifica il ProxyEndpoint in modo che utilizzi il criterio xmltojson mostrato di seguito .

<XMLToJSON name="xmltojson">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

Test dell'esempio

Se non lo hai già fatto, prova a scaricare, eseguire il deployment ed eseguire policy-mashup-cookbook, che puoi trovare nella cartella doc-samples nel repository GitHub di esempi di Apigee Edge. Soltanto segui le istruzioni nel file README nella cartella policy-mashup-cookbook. Oppure segui queste brevi istruzioni: utilizzando dei proxy API di esempio.

Per riepilogare, puoi chiamare l'API composita come segue. Sostituisci {myorg} con il tuo nome dell'organizzazione:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

La risposta include la posizione geocodificata per il centro del codice postale fornito da l'utente finale dell'app, combinata con l'altitudine della posizione geocodificata. I dati erano recuperate da due API di backend, combinate con criteri collegati al proxy API, al client in un'unica risposta.

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

Riepilogo

L'argomento del libro di ricette spiega come utilizzare il pattern di composizione dei criteri per creare un mashup di dati provenienti da più origini backend. La composizione dei criteri è un pattern comune utilizzato nell'API sviluppo di proxy per aggiungere funzionalità della creatività all'API.