Esta página aplica-se ao Apigee e ao Apigee Hybrid.
  
    Veja a documentação do 
    Apigee Edge.
  
  
       
 
  
O quê
A política ExternalCallout permite-lhe enviar pedidos gRPC ao seu servidor gRPC para implementar um comportamento personalizado que não é suportado pelas políticas do Apigee. No código do servidor, pode aceder e modificar facilmente as variáveis de fluxo no fluxo de um proxy.
O Apigee comunica com um servidor gRPC através de uma política ExternalCallout através de uma API. O Apigee usa a API para enviar variáveis de fluxo para o servidor gRPC. No seu servidor gRPC, pode ler e, consoante a variável, modificar as variáveis de fluxo indicadas na página de referência Variáveis de fluxo, bem como variáveis adicionais que especifica no XML da política.
Se configurar o servidor gRPC com o Apigee e incluir esta política num proxy, o Apigee processa os pedidos de API da seguinte forma:
- O Apigee envia uma mensagem que contém as variáveis de fluxo para o seu servidor gRPC.
- O código do servidor gRPC é executado, acedendo e modificando as variáveis conforme definido no código. Em seguida, o servidor gRPC envia uma resposta que contém todas as variáveis de fluxo de volta para o Apigee.
- O Apigee lê a resposta do seu servidor gRPC. Se forem adicionadas variáveis ou as variáveis de fluxo modificáveis forem modificadas, estas são atualizadas no Apigee.
Esta política é uma política padrão e pode ser implementada em qualquer tipo de ambiente. Para obter informações sobre os tipos de políticas e a disponibilidade com cada tipo de ambiente, consulte Tipos de políticas.
Para saber mais sobre o envio de pedidos gRPC, consulte os seguintes links:
<ExternalCallout>
  Define uma política ExternalCallout.
<ExternalCallout async="true" continueOnError="true" enabled="true" name="EC">
Este elemento tem os seguintes atributos comuns a todas as políticas:
| Atributo | Predefinição | Obrigatório? | Descrição | 
|---|---|---|---|
| name | N/A | Obrigatório | O nome interno da política. O valor do atributo  Opcionalmente, use o elemento  | 
| continueOnError | falso | Opcional | Definido como falsepara devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas. Definido comotruepara que a execução do fluxo continue mesmo depois de uma política falhar. Veja também: | 
| enabled | verdadeiro | Opcional | Defina como truepara aplicar a política. Defina comofalsepara desativar a política. A política não é aplicada, mesmo que permaneça anexada a um fluxo. | 
| async | falso | Descontinuado | Este atributo foi descontinuado. | 
A tabela seguinte descreve os elementos secundários de
    <ExternalCallout>.
| Elemento secundário | Obrigatória | Descrição | 
|---|---|---|
| <TimeoutMs> | Obrigatória | O limite de tempo do pedido em milissegundos para pedidos gRPC. | 
| <GrpcConnection> | Obrigatória | Especifica o nome de um TargetServerexistente para ser o servidor gRPC para o qual
        enviar pedidos. | 
| <Configurations> | Opcional | Permite-lhe configurar vários aspetos da política ExternalCallout, incluindo os elementos <Property>e<FlowVariable>. | 
Exemplo 1
Estão disponíveis exemplos funcionais de ExternalCallout em Amostras de chamadas externas no GitHub.
O exemplo seguinte ilustra uma configuração da política ExternalCallout.
<ExternalCallout enabled="true" continueOnError="false" name="ExternalCallout-1"> <DisplayName>External Callout 1</DisplayName> <TimeoutMs>5000</TimeoutMs> <GrpcConnection> <Server name="external-target-server"/> </GrpcConnection> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">false</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">false</Property> <FlowVariable>example1.flow.variable</FlowVariable> <FlowVariable>example2.flow.variable</FlowVariable> </Configurations> <ExternalCallout>
O exemplo envia um pedido a um servidor gRPC externo representado pelo
  
  TargetServer denominado external-target-server, com as seguintes configurações:
- <Property>: Inclua o conteúdo do pedido e da resposta, mas não os cabeçalhos do pedido e da resposta, no pedido enviado para o servidor gRPC.
- <FlowVariable>: Inclua variáveis de fluxo adicionais- example1.flow.variablee- example2.flow.variable, especificadas pelos elementos- FlowVariable, no pedido enviado para o servidor gRPC.
Exemplo 2
No exemplo seguinte, o atributo useTargetUrl do elemento Audience
  está definido como true. Quando useTargetUrl é true,
  o nome do anfitrião do servidor de destino gRPC é usado como público-alvo. Por exemplo, se o anfitrião do servidor for my-grpc-server-java.a.run.app, o público-alvo usado será https://my-grpc-server-java.a.run.app.
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience useTargetUrl="true"/> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Referência de elemento secundário
As secções seguintes descrevem os elementos secundários de ExternalCallout.
<TimeoutMs>
  O limite de tempo do pedido em milissegundos para pedidos gRPC. <TimeoutMs> tem de ser
  um número positivo.
<GrpcConnection>
O elemento <GrpcConnection> define o servidor gRPC como um TargetServer existente, especificado pelo atributo name. Consulte a página de referência de recursos
     
     TargetServer.
Nota: o
    
    protocolo para o TargetServer tem de ser GRPC.
Por exemplo, o seguinte código
<GrpcConnection> <Server name="external-target-server"/> </GrpcConnection>
especifica que o servidor gRPC é um TargetServer existente denominado
    external-target-server.
  Use o elemento <Authentication> (descrito mais adiante nesta secção) para gerar um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como serviços personalizados alojados no Cloud Run.
A tabela seguinte descreve os elementos secundários de
    <GrpcConnection>.
| Elemento secundário | Obrigatório? | Descrição | 
|---|---|---|
| <Server>elemento | Obrigatório | Especifica o servidor gRPC. | 
| <Authentication>elemento | Opcional | Gera um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como o Cloud Run. | 
<Server> elemento
  Especifica o servidor gRPC.
A tabela seguinte descreve os atributos do elemento <Server>.
| Atributo | Descrição | Predefinição | Presença | Tipo | 
|---|---|---|---|---|
| name | O nome de um  | N/A | Obrigatória | String | 
<Authentication> elemento
Gera um token OpenID Connect emitido pela Google para fazer chamadas autenticadas a serviços baseados em gRPC, como serviços personalizados alojados no Cloud Run. A utilização deste elemento requer passos de configuração e implementação descritos no artigo Usar a autenticação Google. Com a configuração adequada, a política cria um token de autenticação para si e adiciona-o ao pedido de serviço.
Este elemento tem um elemento secundário obrigatório: GoogleIDToken.
| Predefinição | N/A | 
| Obrigatório? | Opcional. | 
| Tipo | Tipo complexo | 
| Elemento principal | <GrpcConnection> | 
| Elementos subordinados | <GoogleIDToken> | 
O elemento Authentication usa a seguinte sintaxe:
Sintaxe
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> <Audience ref="variable-1">STRING</Audience> <IncludeEmail ref="variable-2">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Exemplo
O exemplo seguinte mostra o elemento GoogleIDToken:
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Atributos
Nenhum.
Elemento secundário <HeaderName>
Por predefinição, quando existe uma configuração de autenticação, o Apigee gera um token de autorização
    e injeta-o no cabeçalho Authorization na mensagem enviada para o sistema de destino.
    O elemento HeaderName permite especificar o nome de um cabeçalho diferente
    para conter esse token de portador. Esta funcionalidade é particularmente útil quando o destino é um serviço do Cloud Run que usa o cabeçalho X-Serverless-Authorization. O cabeçalho Authorization, se estiver presente, é deixado inalterado e também enviado no pedido.
| Predefinição | N/A | 
| Obrigatório? | Não | 
| Tipo | String | 
| Elemento principal | <Authentication> | 
| Elementos subordinados | Nenhum | 
O elemento HeaderName usa a seguinte sintaxe:
Sintaxe
<ExternalCallout>
...
  <Authentication>
    <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName>
    <GoogleIDToken>
    ... 
    </GoogleIDToken>
  </Authentication>
  ...
</ExternalCallout>Com string estática
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado X-Serverless-Authorization
        que é enviado para o sistema de destino. O cabeçalho Authorization, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication>
  <HeaderName>X-Serverless-Authorization</HeaderName>
  <GoogleIDToken>
    <Audience>https://cloudrun-hostname.a.run.app</Audience>
  </GoogleIDToken>
</Authentication>Com referência a variáveis
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado X-Serverless-Authorization
        que é enviado para o sistema de destino. Se my-variable tiver um valor, esse valor é usado em vez da string predefinida. O cabeçalho Authorization, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication>
Elemento secundário <GoogleIDToken>
Gera tokens OpenID Connect emitidos pela Google para fazer chamadas autenticadas aos serviços Google, como serviços personalizados alojados no Cloud Run.
| Predefinição | N/A | 
| Obrigatório? | Obrigatória | 
| Tipo | String | 
| Elemento principal | <Authentication> | 
| Elementos subordinados | <Audience><IncludeEmail> | 
O elemento GoogleIDToken usa a seguinte sintaxe:
Sintaxe
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience ref="context-variable" useTargetUrl='BOOLEAN'>STRING</Audience> <IncludeEmail ref="context-variable">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Exemplo
O exemplo seguinte mostra o elemento GoogleIDToken:
<Authentication>
  <GoogleIDToken>
      <Audience>https://httpserver0-bar.run.app</Audience>
      <IncludeEmail>true</IncludeEmail>
  </GoogleIDToken>
</Authentication>
Elemento secundário <Audience>
O público-alvo do token de autenticação gerado, como a API ou a conta à qual o token concede acesso.
  Se o valor de Audience estiver vazio, o valor de ref estiver vazio ou for resolvido para um valor vazio e useTargetUrl for true, é usado "https://" + (nome do anfitrião do servidor de destino gRPC) como público-alvo.
  Por exemplo, se o anfitrião do servidor for my-grpc-server-java.a.run.app, o público-alvo usado é https://my-grpc-server-java.a.run.app.
Por predefinição, useTargetUrl é false.
<Audience>explicit-audience-value-here</Audience> or: <Audience ref='variable-name-here'/> or: <Audience ref='variable-name-here' useTargetUrl='true'/> or: <Audience useTargetUrl='true'/>
| Predefinição | N/A | 
| Obrigatório? | Obrigatória | 
| Tipo | String | 
| Elemento principal | <GoogleIDToken> | 
| Elementos subordinados | Nenhum. | 
Elemento secundário <IncludeEmail>
  Se estiver definido como true, o token de autenticação gerado vai conter as reivindicações da
  conta de serviço email e email_verified.
| Predefinição | falso | 
| Obrigatório? | Opcional | 
| Tipo | Booleano | 
| Elemento principal | <GoogleIDToken> | 
| Elementos subordinados | Nenhum. | 
<Configurations>
O elemento <Configurations> permite-lhe configurar vários aspetos da política ExternalCallout, incluindo <Property> e <FlowVariable>.
A tabela seguinte descreve os elementos secundários de
    <Configurations>.
| Elemento secundário | Obrigatório? | Descrição | 
|---|---|---|
| <Property> | Obrigatório | Especifica se os cabeçalhos e/ou o conteúdo de pedido/resposta vão ser enviados para o servidor. Os valores possíveis são  | 
| <FlowVariable> | Obrigatório | Especifica que variáveis de fluxo adicionais devem ser enviadas para o servidor. | 
<Property>
O elemento <Property> especifica se os cabeçalhos e/ou o conteúdo de pedido/resposta
     serão enviados para o servidor. Os valores possíveis são true
     (o item é enviado) ou false (o item não é enviado). O valor predefinido
     é false.
A tabela seguinte descreve os atributos do elemento <Property>.
| Atributo | Descrição | Predefinição | Presença | Tipo | 
|---|---|---|---|---|
| name | Especifica o conteúdo que vai ser enviado para o servidor. Os valores possíveis para  
 | N/A | Obrigatória | String | 
<FlowVariable>
O elemento <FlowVariable> especifica que variáveis de fluxo adicionais
   serão enviadas para o servidor. O valor de
   <FlowVariable> é um prefixo de uma variável, em vez do nome completo da variável.
    Por exemplo , se o elemento a.b.c, o valor de uma variável denominada a.b.c é enviado para o servidor. Da mesma forma, o valor
    de uma variável
    denominada a.b.c.my-variable é enviado para o servidor. Mas o valor de uma variável
    denominada a.x.another-variable não é enviado porque não tem o
    prefixo a.b.c. Seguem-se alguns exemplos
<Configurations> <FlowVariable>a.b.c</FlowVariable> <FlowVariable>d.e.f</FlowVariable> </Configurations>
Referência de erros
Erros de implementação
| Nome do erro | Causa | 
|---|---|
| FAILED_PRECONDITION | Este erro ocorre se a conta de serviço estiver em falta quando o proxy é configurado com a etiqueta <Authentication>.Por exemplo: Deployment of \"organizations/foo/apis/apiproxy/revisions/1\" requires a service account identity, but one was not provided with the request. | 
| PERMISSION_DENIED | Este erro ocorre se houver um problema de autorização com a conta de serviço se o proxy estiver configurado com a etiqueta <Authentication>. Causas possíveis: 
 | 
Erros de tempo de execução
A tabela abaixo descreve os erros de tempo de execução, que podem ocorrer quando a política é executada.
| Código de falha | Estado de HTTP | Causa | 
|---|---|---|
| GrpcTlsInitFailed | 500 | Este erro ocorre se existirem problemas com a inicialização do TLS com o servidor gRPC (como problemas de keystore ou truststore). | 
| steps.externalcallout.[error_code] | 500 | 
 | 
| steps.externalcallout.ExecutionError | 500 | Este erro ocorre se ocorrer alguma outra exceção durante a execução desta política. A exceção subjacente é exposta no faultstring. Se tiver ocorrido um problema com as credenciais do servidor gRPC, o erro terá um aspeto semelhante ao seguinte: 
{
  "fault": {
    "faultstring": "Encountered the following exception while sending the gRPC request or
     processing the response: [io.grpc.StatusRuntimeException: UNAVAILABLE: Credentials failed
     to obtain metadata].",
    "detail": {
      "errorcode": "steps.externalcallout.ExecutionError"
    }
  }
}Pode consultar os registos do MP para obter mais indicações de depuração. | 
| googletoken.EmptyIDTokenAudience | 500 | 
 | 
| steps.externalcallout.ExecutionErrorcom a string de falha: 
 | 500 | 
            Este erro ocorre se o proxy de API estiver configurado com o elemento  
 | 
| steps.externalcallout.ExecutionErrorcom faultstring contendoPERMISSION DENIED.Por exemplo, a faultstring terá o seguinte aspeto para o Cloud Run: 
 | 500 | 
            Este erro ocorre se o proxy da API estiver configurado com o elemento  
 | 
Erros diversos
A tabela abaixo descreve erros diversos. Consulte a causa para ver mais detalhes.
| Código de falha | Causa | 
|---|---|
| ReferencesExistToGrpcServer | Este erro ocorre se um utilizador tentar eliminar um servidor de destino gRPC, mas o servidor ainda estiver a ser usado por outras políticas. | 
Falhas
As variáveis de falha na tabela seguinte são definidas para todas as políticas por predefinição. Consulte as variáveis específicas dos erros de políticas.
| Variáveis | Onde | Exemplos | 
|---|---|---|
| fault.name="fault_name" | fault_nameé o nome da falha, conforme indicado na tabela de erros de tempo de execução acima. O nome da falha é a última parte do código de falha. | fault.namecorresponde a "ExecutionError". | 
| externalcallout.[policy_name].failed | policy_nameé o nome especificado pelo utilizador da política que gerou a falha. | externalcallout.ExternalCallout-1.failed = true |