Como usar a composição de política

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

Neste tópico, você vai aprender a criar um mashup usando a composição de políticas. A composição de políticas é um padrão de proxy da Apigee que permite combinar resultados de vários back-ends em uma única resposta usando políticas.

Para uma visão geral da composição da política, consulte "O padrão de composição da política" no Manual do proxy de API de design.

Fazer o download e testar o exemplo de código

Sobre este exemplo de livro de receitas

Neste exemplo do manual, ilustramos um padrão de proxy de API chamado composição da política. Esse padrão oferece uma maneira (há outras) de combinar dados de várias fontes de back-end. De modo mais geral, este tópico demonstra como as políticas podem ser combinadas e encadeadas para produzir o resultado desejado. Para uma visão geral desse padrão e de outros relacionados, consulte Manual do proxy de API de design.

O exemplo discutido aqui usa a composição de políticas para combinar os dados dessas duas tabelas APIs públicas:

  • Google Geocoding API: essa API converte endereços (como "1600 Amphitheatre Parkway, Mountain View, CA") em coordenadas geográficas (como latitude 37.423021 e longitude -122.083739).
  • O Google Elevation API Esta API fornece uma interface simples para consultas de locais na Terra quanto à elevação dados. Neste exemplo, as coordenadas retornadas pela API Geocoding serão usadas como entrada para essa API.

Os desenvolvedores de apps vão chamar esse proxy de API com dois parâmetros de consulta: CEP e país Código:

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

A resposta é um objeto JSON que inclui o local geocodificado (latitude/longitude) o centro da área do código postal fornecido combinado com a elevação a essa área geocodificada o local.

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

Antes de começar

Para uma breve visão geral do padrão de composição da política, consulte "A política padrão de composição" no Manual do proxy de API de design.

Antes de explorar este exemplo do livro de receitas, você também deve se familiarizar com estes conceitos conceitos importantes:

  • O que são políticas e como anexá-las a proxies. Para uma boa introdução às políticas, consulte O que é um política?.
  • A estrutura de um fluxo de proxy de API, conforme explicado em Como configurar fluxos. Os fluxos permitem que você especificar a sequência em que as políticas são executadas por um proxy de API. Neste exemplo, políticas são criadas e adicionadas ao fluxo do proxy de API.
  • Como um projeto de proxy de API é organizado em seu sistema de arquivos, conforme explicado em Referência de configuração do proxy de API. Este tópico do manual demonstra o desenvolvimento local (arquivo baseado em sistema) do que no desenvolvimento baseado na nuvem, em que é possível usar a interface de gerenciamento para desenvolver o proxy de API.
  • Uso da validação da chave de API. Essa é a forma mais simples de segurança baseada em app que você pode configurar para uma API. Para mais informações, consulte API chaves. Você também pode consultar o Guia de uma API exigindo chaves de API.
  • Conhecimento prático de XML. Neste exemplo, criamos o proxy da API e seu com arquivos XML que residem no sistema de arquivos.

Se você fez download do exemplo de código, poderá localizar todos os arquivos discutidos nesta na pasta de exemplo mashup-policy-cookbook. As seções a seguir vamos conferir os detalhes do exemplo de código.

Siga o fluxo

Antes de passar para as políticas, vamos dar uma olhada no fluxo principal do nosso exemplo proxy de API. O fluxo XML, mostrado abaixo, diz muito sobre esse proxy, as políticas que ele usa e onde essas políticas são chamadas.

No exemplo de download, você encontra esse XML no arquivo 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>

Veja um resumo dos elementos do fluxo.

  • &lt;Request&gt;: a <Request> de um elemento consiste em várias &lt;Step&gt; os elementos. Cada etapa chama uma das políticas que vamos criar nas outras deste tópico. Essas políticas estão relacionadas à criação de uma mensagem de solicitação, ao envio dela e e analisar a resposta. Ao final deste tópico, você entenderá a função de cada um desses elementos políticas.
  • &lt;Response&gt;: o campo <Response> também inclui <Etapas>. Essas etapas também chamam as políticas responsáveis pelo processamento do ponto de extremidade de destino (a API Google Elevation).
  • &lt;HttpProxyConnection&gt;: esse elemento especifica detalhes sobre como os aplicativos se conectarão a esse proxy de API, incluindo o <BasePath>, que especifica como essa API será chamada.
  • &lt;RouteRule&gt;: este elemento especifica o que acontece imediatamente depois que as mensagens de solicitação recebidas forem processadas. Neste caso, o TargetEndpoint é chamado. Discutiremos mais sobre essa etapa importante posteriormente neste tópico.

Como criar as políticas

As seções a seguir discutem cada uma das políticas que compõem essa composição exemplo.

Crie a primeiraAssignMessage política

A primeira política AssignMessage, abaixo, cria uma mensagem de solicitação que será enviada ao serviço de serviço.

Vamos começar com o código da política e, em seguida, explicar os elementos dele em mais detalhes. Na exemplo de download, você pode encontrar esse XML no arquivo 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>

Veja uma breve descrição dos elementos desta política. Saiba mais sobre o assunto política em Atribuir Política de mensagens.

  • <AssignMessage name>: dá um nome à política. O nome é usada quando a política é referenciada em um fluxo.
  • &lt;AssignTo&gt;: cria uma variável nomeada chamada GeocodingRequest. Essa variável encapsula o objeto de solicitação que será enviado ao back-end pelo Política de Service callout.
  • &lt;QueryParams&gt;: define os parâmetros de consulta necessários para o chamada de API de back-end. Nesse caso, a API Geocoding precisa saber o local, que é expresso com um código postal e um ID de país. O usuário do aplicativo fornece essas informações, e nós os extraímos aqui. O parâmetro sensor é exigido pela API e é verdadeiro ou falso, e nós apenas fixamos no código como falso aqui.
  • &lt;Verb&gt;: neste caso, estamos fazendo uma solicitação GET simples para o API.
  • &lt;AssignVariable&gt;: essas variáveis armazenam os valores que estamos passando para a API. Neste exemplo, as variáveis serão acessadas mais tarde na resposta retornados ao cliente.

Envie a solicitação com ServiceCall

A próxima etapa na sequência de composição da política é criar uma política ServiceCallout. A A política ServiceCall, listada abaixo, envia o objeto de solicitação que criamos na anterior AttributionMessage ao serviço Google Geocoding, e salva o resultado em uma chamada GeocodingResponse.

Como antes, primeiro vamos analisar o código. Confira a seguir uma explicação detalhada. Você pode ler mais informações sobre essa política em Service calls política. No exemplo de download, você encontra esse XML no arquivo 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>

Veja uma breve descrição dos elementos dessa política.

  • &lt;ServiceCallout&gt; - Assim como na política anterior, esta tem um nome.
  • <Variável da solicitação>: é a variável que foi criada no a política AttributionMessage. Ela encapsula a solicitação enviada para a API de back-end.
  • &lt;Response&gt;: este elemento nomeia uma variável na qual a resposta é armazenado. Como você verá, essa variável será acessada posteriormente pelo comando política.
  • &lt;HTTPTargetConnection&gt;: especifica o URL de destino do back-end. API. Nesse caso, especificamos que a API retorne uma resposta JSON.

Agora temos duas políticas, uma que especifica as informações da solicitação necessárias para usar o API de back-end (API Geocoding do Google) e a segunda que envia a solicitação para a API de back-end. A seguir, processaremos a resposta.

Analise a resposta com ExtractVariables

A política ExtractVariables é um mecanismo simples de análise de conteúdo da mensagem de resposta recebida por uma política ServiceCall. ExtractVariables pode ser usado para analisar JSON ou XML, ou pode ser usado para extrair conteúdo de caminhos de URI, cabeçalhos HTTP, consultas parâmetros e parâmetros de formulário.

Esta é uma listagem da política ExtractVariables. Leia mais sobre essa política em Extrair variáveis política. No exemplo de download, você encontra esse XML no arquivo 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>

Os principais elementos da política ExtractVariable são:

  • <ExtractVariables name>: o nome da política é usado para consulte a política quando ela for usada em um fluxo.
  • &lt;Source&gt;: especifica a variável de resposta que criamos em a política Service callout. Esta é a variável da qual esta política extrai dados.
  • &lt;VariablePrefix&gt;: o prefixo variável especifica um namespace para e outras variáveis criadas nesta política. O prefixo pode ser qualquer nome, exceto o nome definidos pela política do Edge variáveis predefinidas.
  • &lt;JSONPayload&gt; - Este elemento recupera os dados de resposta que são de interesse para nós e os coloca em variáveis nomeadas. Na verdade, a API Geocoding retorna muito mais informações do que latitude e longitude. No entanto, esses são os únicos valores de que precisamos para esta amostra. É possível ver uma renderização completa do JSON retornado pela API Geocoding na API Documentação. Os valores de Geocoding.location.lat e Geolocation.location.lng são simplesmente dois dos muitos campos no objeto JSON retornado.

Pode não ser óbvio, mas é importante observar que ExtractVariables produz duas variáveis cujos nomes consistem no prefixo da variável (Geocodingresponse) e do de variáveis especificados na política. Essas variáveis são armazenadas proxy de API e estará disponível para outras políticas dentro do fluxo do proxy, como você de ver. As variáveis são:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

A maior parte do trabalho já está concluída. Criamos uma combinação de três políticas que formam uma a solicitação, chamar uma API de back-end e analisar os dados JSON retornados. Nas etapas finais, vamos alimentar dados dessa parte do fluxo para outra política AttributionMessage, chame o segundo back-end (Google Elevation API) e retorna nossos dados combinados ao desenvolvedor do aplicativo.

Gere a segunda solicitação comassignMessage

A política AttributionMessage a seguir usa variáveis retornadas do primeiro back-end (Google Geocoding) que armazenamos e os conecta a uma solicitação destinada à segunda API (Google Elevação). Como observado anteriormente, essas variáveis são Geocodingresponse.latitude e geocoderesponse.longitude.

No exemplo de download, você encontra esse XML no arquivo 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 você examinar a Google Elevation API, verá que ela usa dois parâmetros de consulta. A primeira é chamada locations, e o valor dela é a latitude e longitude. (valores separados por vírgula). O outro parâmetro é sensor, que é obrigatório e precisa ser verdadeiro ou falso. O mais importante nesse ponto é que a solicitação mensagem criada aqui não requer um Service callout. Não precisamos chamar o segundo a partir de uma ServiceChamada neste ponto porque podemos chamar a API de back-end a partir do objeto o TargetEndpoint. Temos todos os dados necessários para chamar o Google Elevations API. A mensagem de solicitação gerada nesta etapa não requer um ServiceCall, já que o gerada para o pipeline de solicitação principal e, portanto, será simplesmente encaminhado pelo ProxyEndpoint ao TargetEndpoint, seguindo a RouteRule configurada para este proxy de API. O TargetEndpoint gerencia a conexão com a API remota. Lembre-se de que o URL do URL A API Elevation está definida na HTTPConnection do TargetEndpoint. API Elevation documentação se quiser saber mais. O QueryParams que armazenamos anteriormente, country e postalcode não são mais necessárias. Por isso, elas foram removidas. aqui.

Breve pausa: de volta ao fluxo

Agora você pode se perguntar por que não estamos criando outra política de Service callout. Depois criamos outra mensagem. Como essa mensagem é enviada para o alvo, a equipe do Google API Elevation? A resposta está no conjunto <RouteRule> elemento do fluxo. &lt;RouteRule&gt; especifica o que fazer com as mensagens de solicitação restantes após a <Request> parte de o fluxo foi executado. O TargetEndpoint especificado por esta <RouteRule> diz ao proxy de API para entregar a mensagem para http://maps.googleapis.com/maps/api/elevation/xml.

Se você tiver feito o download do proxy de API de exemplo, poderá encontrar o XML do TargetProxy no arquivo 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>

Agora, só precisamos processar a resposta da API do Google Elevation e vamos feito.

Converta a resposta de XML para JSON

Neste exemplo, a resposta da Google Elevation API é retornada como XML. Para "extras crédito", vamos adicionar mais uma política ao nosso composto para transformar a resposta XML em JSON.

Este exemplo usa a política JavaScript chamada GenerateResponse, com um arquivo de recurso que contém o código JavaScript, para realizar a conversão. O exemplo abaixo a definição da política GenerateResponse:

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

O arquivo de recursos GenerateResponse.js inclui o JavaScript usado para executar a e conversão em massa. Você pode ver esse código doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

A Apigee também oferece uma política pronta para uso, XMLToJSON, para converter XML em JSON. Você pode edite o ProxyEndpoint para usar a política xmltojson mostrada abaixo como alternativa.

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

Como testar o exemplo

Se você ainda não tiver feito isso, tente fazer o download, implantar e executar o policy-mashup-cookbook, que está na pasta "doc-samples" (em inglês) no repositório de exemplos do Apigee Edge no GitHub. Assim siga as instruções do arquivo README na pasta policy-mashup-cookbook. Ou siga as breves instruções aqui: Usar proxies de API de amostra.

Para resumir, você pode chamar a API composta da seguinte forma: Substitua {myorg} por sua nome da organização:

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

A resposta inclui a localização geocodificada do centro do código postal fornecido por o usuário final do aplicativo, combinado com a elevação nesse local geocodificado. Os dados eram recuperado de duas APIs de back-end, combinado com políticas anexadas ao proxy de API e ao cliente em uma única resposta.

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

Resumo

Este tópico do manual explicou como usar o padrão de composição da política para criar um mashup de dados de várias fontes de back-end. A composição de políticas é um padrão comum usado em APIs desenvolvimento de proxy para adicionar a funcionalidade do criativo à sua API.