Utilizzo della composizione dei criteri

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

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

Per una panoramica generale della composizione delle policy, consulta "Il pattern di composizione delle policy" in Pattern del cookbook dei proxy API patterns.

Scarica e prova il codice campione

Informazioni su questo esempio di cookbook

Questo esempio di cookbook illustra un pattern di proxy API chiamato composizione delle policy. Questo pattern fornisce un modo (ce ne sono altri) per combinare i dati di più origini di backend. Più in generale, questo argomento mostra come le policy possono essere combinate e concatenate per produrre il risultato desiderato. Per una panoramica generale di questo pattern e di altri correlati, consulta Pattern del cookbook dei proxy API patterns.

L'esempio discusso qui utilizza la composizione delle policy per combinare i dati di queste due API pubbliche separate:

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

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

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

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

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

Prima di iniziare

Se vuoi leggere una breve panoramica del pattern di composizione delle policy, consulta "Il pattern di composizione delle policy" in Pattern del cookbook dei proxy API.

Prima di esplorare questo esempio di cookbook, dovresti anche conoscere questi concetti fondamentali:

  • Che cosa sono le policy e come collegarle ai proxy. Per una buona introduzione alle policy, consulta Che cos'è una policy?.
  • La struttura di un flusso di proxy API, come spiegato in Configurare i flussi. I flussi ti consentono di specificare la sequenza in cui le policy vengono eseguite da un proxy API. In questo esempio, vengono create e aggiunte diverse policy al flusso del proxy API.
  • Come è organizzato un progetto di proxy API nel file system, come spiegato in Riferimento per la configurazione dei proxy API. Questo argomento del cookbook illustra lo sviluppo locale (basato sul file system) anziché lo sviluppo basato sul cloud, in cui potresti utilizzare l'interfaccia utente di gestione per sviluppare il proxy API.
  • Utilizzo della convalida delle chiavi API. Questa è la forma più semplice di sicurezza basata su app che puoi configurare per un'API. Per saperne di più, consulta Chiavi API. Puoi anche seguire il tutorial Proteggere un'API richiedendo le chiavi API.
  • Una conoscenza pratica di XML. In questo esempio, creiamo il proxy API e le relative policy con file XML che risiedono nel file system.

Se hai scaricato il codice campione, puoi trovare tutti i file descritti in questo argomento nella cartella di esempio mashup-policy-cookbook. Le sezioni che seguono descrivono il codice campione nel dettaglio.

Segui il flusso

Prima di passare alle policy, diamo un'occhiata al flusso principale del nostro proxy API di esempio Il codice XML del flusso, mostrato di seguito, ci dice molto su questo proxy, sulle policy che utilizza e su dove vengono chiamate queste policy.

Nel download di esempio, puoi trovare questo codice 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.

  • <Request> - L'elemento <Request> è composto da diversi <Step> elementi. Ogni passaggio chiama una delle policy che creeremo nel resto di questo argomento. Queste policy riguardano la creazione di un messaggio di richiesta, l'invio e l'analisi della risposta. Al termine di questo argomento, comprenderai il ruolo di ciascuna di queste policy.
  • <Response> - L'elemento <Response> include anche <Steps>. Questi passaggi chiamano anche le policy responsabili dell'elaborazione della risposta finale dall'endpoint di destinazione (l'API Google Elevation).
  • <HttpProxyConnection> - Questo elemento specifica i dettagli su come le app si connetteranno a questo proxy API, incluso <BasePath>, che specifica come questa API verrà chiamata.
  • <RouteRule> - Questo elemento specifica cosa succede immediatamente dopo l'elaborazione dei messaggi di richiesta in entrata. In questo caso, viene chiamato TargetEndpoint. Parleremo di questo passaggio importante più avanti in questo argomento.

Creazione delle policy

Le sezioni che seguono descrivono ciascuna delle policy che compongono questo esempio di composizione delle policy.

Crea la prima policy AssignMessage

La prima policy AssignMessage, elencata di seguito, crea un messaggio di richiesta che verrà inviato al servizio Google Geocoding service.

Iniziamo con il codice della policy, poi spiegheremo gli elementi in modo più dettagliato. Nel download di esempio, puoi trovare questo codice 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>

Ecco una breve descrizione degli elementi di questa policy. Puoi saperne di più su questa policy in Policy Assign Message.

  • <AssignMessage name> - Assegna un nome a questa policy. Il nome viene utilizzato quando si fa riferimento alla policy in un flusso.
  • <AssignTo> - Crea una variabile denominata GeocodingRequest. Questa variabile incapsula l'oggetto della richiesta che verrà inviato al backend dalla policy ServiceCallout.
  • <QueryParams> - Imposta i parametri di query necessari per la chiamata API di backend. In questo caso, l'API Geocoding deve conoscere la località, espressa con un codice postale e un ID paese. L'utente dell'app fornisce queste informazioni e noi le estraiamo semplicemente qui. Il parametro sensor è richiesto dall'API e può essere true o false. Qui lo codifichiamo come false.
  • <Verb> - In questo caso, stiamo effettuando una semplice richiesta GET all' API.
  • <AssignVariable> - Queste variabili memorizzano i valori che stiamo passando all'API. In questo esempio, le variabili verranno utilizzate in un secondo momento nella risposta restituita al client.

Invia la richiesta con ServiceCallout

Il passaggio successivo nella sequenza di composizione delle policy è la creazione di una policy ServiceCallout. La policy ServiceCallout, elencata di seguito, invia l'oggetto della richiesta che abbiamo creato nella policy AssignMessage precedente al servizio Google Geocoding e salva il risultato in una variabile denominata GeocodingResponse.

Come prima, diamo un'occhiata al codice. Di seguito è riportata una spiegazione dettagliata. Puoi saperne di più su questa policy in Policy Service Callout. Nel download di esempio, puoi trovare questo codice 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>

Ecco una breve descrizione degli elementi di questa policy.

  • <ServiceCallout> - Come la policy precedente, anche questa ha un nome.
  • <Request variable> - Questa è la variabile creata nella policy AssignMessage. Incapsula la richiesta all'API di backend.
  • <Response> - Questo elemento assegna un nome a una variabile in cui viene memorizzata la risposta è archiviata. Come vedrai, questa variabile verrà utilizzata in un secondo momento dalla policy ExtractVariables.
  • <HTTPTargetConnection> - Specifica l'URL di destinazione dell'API di backend API. In questo caso, specifichiamo che l'API restituisce una risposta JSON.

Ora abbiamo due policy: una che specifica le informazioni sulla richiesta necessarie per utilizzare l'API di backend (l'API Geocoding di Google) e la seconda che invia effettivamente la richiesta all'API di backend. Ora gestiremo la risposta.

Analizza la risposta con ExtractVariables

La policy ExtractVariables fornisce un meccanismo semplice per analizzare i contenuti del messaggio di risposta ottenuto da una policy ServiceCallout. ExtractVariables può essere utilizzato per analizzare JSON o XML oppure per estrarre contenuti da percorsi URI, intestazioni HTTP, parametri di query e parametri del modulo.

Ecco un elenco della policy ExtractVariables. Puoi saperne di più su questa policy in Policy Extract Variables. Nel download di esempio, puoi trovare questo codice 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 della policy ExtractVariable sono:

  • <ExtractVariables name> - Anche in questo caso, il nome della policy viene utilizzato per fare riferimento alla policy quando viene utilizzata in un flusso.
  • <Source> - Specifica la variabile di risposta creata nella policy ServiceCallout. Questa è la variabile da cui questa policy estrae i dati.
  • <VariablePrefix> - Il prefisso della variabile specifica uno spazio dei nomi per altre variabili create in questa policy. Il prefisso può essere qualsiasi nome, ad eccezione dei nomi riservati definiti dalle variabili predefinite di Edge's.
  • <JSONPayload> - Questo elemento recupera i dati di risposta che ci interessano e li inserisce in variabili denominate. In realtà, l'API Geocoding restituisce molte più informazioni di latitudine e longitudine. Tuttavia, questi sono gli unici valori di cui abbiamo bisogno per questo esempio. Puoi vedere un rendering completo del JSON restituito dall'API Geocoding nella documentazione dell'API. I valori di geometry.location.lat e geometry.location.lng sono semplicemente due dei tanti campi dell'oggetto JSON restituito.

Potrebbe non essere ovvio, ma è importante notare che ExtractVariables produce due variabili i cui nomi sono costituiti dal prefisso della variabile (geocoderesponse) e dai nomi delle variabili effettivi specificati nella policy. Queste variabili vengono memorizzate nel proxy API e saranno disponibili per altre policy all'interno del flusso del proxy, come vedrai. Le variabili sono:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

La maggior parte del lavoro è stata completata. Abbiamo creato una composizione di tre policy che formano una richiesta, chiamano un'API di backend e analizzano i dati JSON restituiti. Nei passaggi finali, inseriremo i dati di questa parte del flusso in un'altra policy AssignMessage, chiameremo la seconda API di backend (l'API Google Elevation) e restituiremo i dati combinati allo sviluppatore di app.

Genera la seconda richiesta con AssignMessage

La seguente policy AssignMessage utilizza le variabili restituite dal primo backend (Google Geocoding) che abbiamo memorizzato e le inserisce in una richiesta destinata alla seconda API (Google Elevation). Come indicato in precedenza, queste variabili sono geocoderesponse.latitude e geocoderesponse.longitude.

Nel download di esempio, puoi trovare questo codice 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 accetta due parametri di query. Il primo si chiama locations e il suo valore è la latitudine e la longitudine (valori separati da virgole). L'altro parametro è sensor, che è obbligatorio e deve essere true o false. La cosa più importante da notare a questo punto è che il messaggio di richiesta che creiamo qui non richiede un ServiceCallout. Non è necessario chiamare la seconda API da un ServiceCallout a questo punto perché possiamo chiamare l'API di backend da TargetEndpoint del proxy. Se ci pensi, abbiamo tutti i dati necessari per chiamare l'API Google Elevation Il messaggio di richiesta generato in questo passaggio non richiede un ServiceCallout, poiché la richiesta generata per la pipeline di richiesta principale verrà semplicemente inoltrata da ProxyEndpoint a TargetEndpoint, seguendo la RouteRule configurata per questo proxy API. TargetEndpoint gestisce la connessione con l'API remota. Ricorda che l'URL dell'API Elevation è definito in HTTPConnection per TargetEndpoint. Documentazione dell'API Elevation se vuoi saperne di più. I parametri di query che abbiamo memorizzato in precedenza, country e postalcode, non sono più necessari, quindi li rimuoviamo qui.

Breve pausa: torna al flusso

A questo punto, potresti chiederti perché non stiamo creando un'altra policy ServiceCallout. Dopo tutto, abbiamo creato un altro messaggio. Come viene inviato questo messaggio al target, l'API Google Elevation? La risposta si trova nell'elemento <RouteRule> del flusso. <RouteRule> specifica cosa fare con gli eventuali messaggi di richiesta rimanenti dopo l'esecuzione della parte <Request> del flusso. TargetEndpoint specificato da questo <RouteRule> indica al proxy API di inviare il messaggio a http://maps.googleapis.com/maps/api/elevation/xml.

Se hai scaricato il proxy API di esempio, puoi trovare il codice XML di 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 abbiamo finito.

Converti la risposta da XML a JSON

In questo esempio, la risposta dell'API Google Elevation viene restituita come XML. Per "credito extra," aggiungiamo un'altra policy alla nostra composizione per trasformare la risposta da XML a JSON.

Questo esempio utilizza la policy JavaScript denominata GenerateResponse, con un file di risorse contenente il codice JavaScript, per eseguire la conversione. Di seguito è riportata la definizione della policy GenerateResponse:

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

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

Apigee fornisce anche una policy predefinita, XMLToJSON, per convertire XML in JSON. Puoi modificare ProxyEndpoint per utilizzare invece la policy xmltojson mostrata di seguito.

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

Test dell'esempio

Se non l'hai ancora fatto, prova a scaricare, eseguire il deployment ed eseguire l'esempio policy-mashup-cookbook , che puoi trovare nella cartella doc-samples nel repository di esempi di Apigee Edge su GitHub. Basta seguire le istruzioni nel file README nella cartella policy-mashup-cookbook. In alternativa, segui le brevi istruzioni qui: Utilizzare i proxy API di esempio.

Per riassumere, puoi chiamare l'API composita nel seguente modo. Sostituisci {myorg} con il nome della tua organizzazione:

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

La risposta include la località geocodificata per il centro del codice postale fornito da l'utente finale dell'app, combinata con l'elevazione in quella località geocodificata. I dati sono stati recuperati da due API di backend, combinati con le policy collegate al proxy API e restituiti 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

Questo argomento del cookbook ha spiegato come utilizzare il pattern di composizione delle policy per creare un mashup di dati provenienti da più origini di backend. La composizione delle policy è un pattern comune utilizzato nello sviluppo di proxy API per aggiungere funzionalità creative all'API.