Política de JavaScript

Esta página se aplica à Apigee e à Apigee híbrida.

Confira a documentação da Apigee Edge.

A política JavaScript permite adicionar código JavaScript personalizado que é executado no contexto do fluxo de proxy de API. Essa política permite implementar um comportamento personalizado que não é coberto pelas políticas da Apigee.

No seu código JavaScript personalizado, é possível usar os objetos, métodos e propriedades do modelo de objeto JavaScript da Apigee. É possível receber, definir e remover variáveis no contexto de fluxo do proxy, executar lógica personalizada, realizar tratamento de falhas, extrair dados de solicitações ou respostas e editar dinamicamente o URL de destino do back-end. Também é possível usar funções criptográficas básicas disponíveis no modelo de objeto.

A política JavaScript permite especificar um arquivo de origem JavaScript a ser executado ou incluir código JavaScript diretamente na configuração da política usando o elemento <Source>. De qualquer forma, o código do JavaScript será executado quando a etapa a que a política está anexada for executada.

Para a opção de arquivo de origem, o código-fonte é sempre armazenado em um local padrão no pacote do proxy: apiproxy/resources/jsc. Se preferir, armazene o código-fonte em um arquivo de recurso no nível do ambiente ou da organização. Para instruções, consulte Arquivos de recursos. Também é possível fazer o upload de JavaScript usando o editor de proxy da interface da Apigee.

A Apigee não recomenda o uso da política JavaScript para o seguinte:

  • Geração de registros. A política MessageLogging é mais adequada para geração de registros com plataformas de geração de registros de terceiros, como Splunk, Sumo e Loggly. Essa política também melhora o desempenho do proxy de API ao ser executada no PostClientFlow depois que a resposta é retornada ao cliente.
  • Substituição das políticas da Apigee. A política JavaScript não substitui os recursos das políticas do Apigee. Se os recursos necessários estiverem disponíveis em uma política da Apigee, use essa política em vez de implementar uma solução personalizada em JavaScript. O código JavaScript personalizado pode não corresponder à performance e à otimização das políticas da Apigee.

Os arquivos de origem JavaScript precisam ter uma extensão .js.

A Apigee é compatível com JavaScript executado no mecanismo JavaScript Rhino 1.7.13.

Esta é uma política extensível. O uso dela pode ter implicações no custo ou na utilização, dependendo da sua licença da Apigee. Para informações sobre tipos de política e implicações de uso, consulte Tipos de política.

Amostras

Reescrever o URL de destino

Um caso de uso comum envolve extrair dados de um corpo de solicitação, armazená-los em uma variável de fluxo e usar essa variável de fluxo em outro lugar do fluxo de proxy. Por exemplo, suponha que um usuário insira o nome em um formulário HTML e o envie. Para extrair os dados do formulário e adicioná-los dinamicamente ao URL do serviço de back-end, use uma política JavaScript.

  1. Na interface da Apigee, abra o proxy que você criou no editor de proxy.
  2. Selecione a guia Desenvolver.
  3. No menu "Novo", selecione Novo script.
  4. Na caixa de diálogo, selecione JavaScript e nomeie o script como js-example.
  5. Cole o código a seguir no editor de código e salve o proxy. O objeto context está disponível para o código JavaScript em qualquer lugar no fluxo do proxy. Ele recebe constantes específicas do fluxo, chama métodos get/set úteis e realiza outras operações. Esse objeto faz parte do modelo de objeto JavaScript da Apigee. A variável de fluxo target.url é uma variável integrada de leitura/gravação acessível no fluxo de solicitação de destino. Quando você define essa variável com o URL da API, a Apigee chama esse URL de back-end. Isso reescreve o URL de destino original, que era o URL especificado ao criar o proxy (por exemplo, http://www.example.com).
    if (context.flow=="PROXY_REQ_FLOW") {
         var username = context.getVariable("request.formparam.user");
         context.setVariable("info.username", username);
    }
    
    
    if (context.flow=="TARGET_REQ_FLOW") {
         context.setVariable("request.verb", "GET");
         var name = context.getVariable("info.username");
         var url = "http://mocktarget.apigee.net/"
         context.setVariable("target.url", url + "?user=" + name);
    }
  6. No menu "Nova política", selecione JavaScript.
  7. Nomeie a política como target-rewrite. Aceite os padrões e salve a política.
  8. Depois de selecionar o Pré-fluxo do endpoint do proxy no Navegador, a política será adicionada a esse fluxo.
  9. No Navegador, selecione Pré-fluxo do endpoint de destino.
  10. No Navegador, arraste a política JavaScript para o lado da solicitação do endpoint de destino no editor de fluxo.
  11. Salvar.
  12. Substitua o nome da organização e do proxy ao chamar a API:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Examine a definição de XML para a política JavaScript usada neste exemplo. O elemento <ResourceURL> especifica o arquivo de origem JavaScript a ser executado. Esse padrão se aplica a qualquer arquivo de origem JavaScript: jsc://filename.js. Se o código JavaScript exigir inclusões, use um ou mais elementos <IncludeURL>, conforme descrito mais adiante neste documento.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite">
    <DisplayName>target-rewrite</DisplayName>
    <Properties/>
    <ResourceURL>jsc://js-example.js</ResourceURL>
</Javascript>

Recuperar valor de propriedade do JavaScript

É possível adicionar um elemento <Property> na configuração e recuperar o valor dele com JavaScript no ambiente de execução.

Use o atributo name do elemento para especificar o nome com que acessar a propriedade a partir do código JavaScript. O valor do elemento <Property> (o valor entre as tags de abertura e fechamento) é o valor literal que o JavaScript recebe.

Em JavaScript, você recupera o valor da propriedade da política acessando-o como uma propriedade do objeto Properties, como segue:

  • Configure a propriedade O valor da propriedade é o nome da variável response.status.code.
    <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite">
        <DisplayName>JavascriptURLRewrite</DisplayName>
        <Properties>
            <Property name="source">response.status.code</Property>
        </Properties>
        <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL>
    </Javascript>
  • Recupere a propriedade usando JavaScript. A função getVariable usa o nome da variável recuperada para extrair o valor dela.
    var responseCode = properties.source; // Returns "response.status.code"
    var value = context.getVariable(responseCode); // Get the value of response.status.code
    context.setVariable("response.header.x-target-response-code", value);

Tratamento de erros

Para exemplos e uma discussão sobre técnicas de tratamento de erros que podem ser usadas em uma chamada de JavaScript, consulte Forma correta para retornar um erro de uma política JavaScript. As sugestões na comunidade da Apigee são apenas para fins informativos e não representam necessariamente as práticas recomendadas pelo Google.

Referência de elemento

A referência de elementos descreve os elementos e atributos da política do JavaScript.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false"
        continueOnError="false" enabled="true" timeLimit="200"
        name="JavaScript-1">
    <DisplayName>JavaScript 1</DisplayName>
    <Properties>
        <Property name="propName">propertyValue</Property>
    </Properties>
    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
    <IncludeURL>jsc://a-javascript-library-file</IncludeURL>
    <ResourceURL>jsc://my-javascript-source-file</ResourceURL>
    <Source>insert_js_code_here</Source>
</Javascript>

Atributos <JavaScript>

< languageVersion="VERSION_1_3" Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">
Atributo Descrição Padrão Presença
languageVersion

Especifica a versão da linguagem JavaScript em que o código foi escrito. Os valores incluem VERSION_DEFAULT, VERSION_1_0, VERSION_1_1, VERSION_1_2, VERSION_1_3, VERSION_1_4, VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8 e VERSION_ES6.

VERSION_DEFAULT Opcional
timeLimit

Especifica o tempo máximo (em milissegundos) que um script pode ser executado. Por exemplo, se um limite de 200 ms for excedido, a política vai gerar o erro: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

N/A Obrigatório

A tabela a seguir descreve atributos comuns a todos os elementos pai de políticas:

Atributo Descrição Padrão Presence
name

O nome interno da política. O valor do atributo name pode conter letras, números, espaços, hifens, sublinhados e pontos. Esse valor não pode exceder 255 caracteres.

Opcionalmente, use o elemento <DisplayName> para rotular a política no editor de proxy da IU de gerenciamento com um nome de linguagem natural diferente.

N/A Obrigatório
continueOnError

Defina como false para retornar um erro quando uma política falhar. Esse é o comportamento esperado na maioria das políticas.

Defina como true para que a execução do fluxo continue mesmo depois que uma política falhar. Consulte também:

false Opcional
enabled

Defina como true para aplicar a política.

Defina como false para desativar a política. A política não será aplicada mesmo se ela permanecer anexada a um fluxo.

true Opcional
async

Esse atributo está obsoleto.

false Descontinuado

Elemento <DisplayName>

Use em conjunto com o atributo name para rotular a política no editor de proxy da IU de gerenciamento com um nome de linguagem natural diferente.

<DisplayName>Policy Display Name</DisplayName>
Padrão

N/A

Se você omitir esse elemento, será usado o valor do atributo name da política.

Presence Opcional
Tipo String

Elemento <IncludeURL>

Especifica um arquivo de biblioteca JavaScript que será carregado como dependência ao arquivo JavaScript principal especificado com o elemento <ResourceURL> ou <Source>. A política avalia os scripts na ordem em que estão listados. O código pode usar os objetos, métodos e propriedades do modelo de objeto JavaScript.

Inclua mais de um recurso de dependência JavaScript usando elementos <IncludeURL> adicionais.

<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
Padrão: Nenhum
Presença: Opcional
Tipo: String

Elemento <Property>

Especifica uma propriedade que você pode acessar a partir do código JavaScript no momento da execução.

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
Padrão: Nenhum
Presença: Opcional
Tipo: String

Atributos

Atributo Descrição Padrão Presença
nome

Especifica o nome da propriedade.

N/A Obrigatório

Exemplo

Veja o exemplo na seção Amostras.

Elemento <ResourceURL>

Especifica o arquivo JavaScript principal que é executado no fluxo da API. É possível armazenar esse arquivo no escopo do proxy de API (em /apiproxy/resources/jsc no pacote de proxy de API ou na seção Scripts do painel Navegador do editor proxy de API). Como alternativa, armazene-o nos escopos da organização ou do ambiente para reutilização em vários proxies de API, conforme descrito em Como gerenciar recursos. O código pode usar os objetos, métodos e propriedades do modelo de objeto JavaScript.

<ResourceURL>jsc://my-javascript.js</ResourceURL>
Padrão: Nenhum
Presença: É necessário <ResourceURL> ou <Source>. Se <ResourceURL> e <Source> estiverem presentes, a política vai ignorar <ResourceURL>.
Tipo: String

Exemplo

Veja o exemplo na seção Amostras.

Elemento <Source>

É possível inserir o JavaScript diretamente na configuração XML da política. O código do JavaScript inserido será executado quando a política for executada no fluxo da API.

Padrão: Nenhum
Presença: É necessário <ResourceURL> ou <Source>. Se <ResourceURL> e <Source> estiverem presentes, a política vai ignorar <ResourceURL>.
Tipo: String

Exemplo

<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' >
  <Properties>
    <Property name='inboundHeaderName'>specialheader</Property>
    <Property name='outboundVariableName'>json_stringified</Property>
  </Properties>
  <Source>
var varname = 'request.header.' + properties.inboundHeaderName + '.values.string';
var h = context.getVariable(varname);
if (h) {
  h = JSON.parse(h);
  h.augmented = (new Date()).valueOf();
  var v = JSON.stringify(h, null, 2) + '\n';
  // further indent
  var r = new RegExp('^(\S*)','mg');
  v= v.replace(r,'    $1');
  context.setVariable(properties.outboundVariableName, v);
}
  </Source>
</Javascript>

Elemento <SSLInfo>

Especifica as propriedades usadas para configurar o TLS para todas as instâncias do cliente HTTP criadas pela política JavaScript.

    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
Padrão: Nenhum
Presença: Opcional
Tipo: String

O processo de configuração do TLS para um cliente HTTP é o mesmo usado para configurar o TLS para um TargetEndpoint/TargetServer. Saiba mais em Opções para configurar o TLS.

Observações sobre uso

Como depurar o código da política JavaScript

Use a função print() para enviar informações de depuração para o painel de saída da transação na ferramenta Debug. Para detalhes e exemplos, consulte Depurar JavaScript com instruções print().

Para ver instruções de impressão na ferramenta de depuração:

  1. Abra a ferramenta Debug e inicie uma sessão de trace para um proxy que contenha a política do JavaScript.
  2. Chame o proxy.
  3. Na Ferramenta Debug, clique em Saída de todas as transações para abrir o painel de saída.

    Painel &quot;Saída de todas as transações&quot; na ferramenta Apigee Trace, mostrando instruções de impressão.

  4. Suas declarações de impressão aparecem neste painel.

Variáveis de fluxo

Essa política não preenche nenhuma variável por padrão. No entanto, é possível definir e receber variáveis de fluxo no código JavaScript chamando métodos no objeto context. Exemplo:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))

O objeto context faz parte do modelo de objeto JavaScript da Apigee.

Referência de erros

Nesta seção, descrevemos os códigos de falha e as mensagens de erro retornadas e as variáveis com falha definidas pela Apigee quando essa política aciona um erro. Essas informações são importantes para saber se você está desenvolvendo regras de falha para lidar com falhas. Para saber mais, consulte O que você precisa saber sobre erros de política e Como lidar com falhas.

Erros de execução

Esses erros podem ocorrer quando a política é executada.

Código de falha Status HTTP Causa Correção
steps.javascript.ScriptExecutionFailed 500 A política JavaScript pode gerar vários tipos diferentes de erros ScriptExecutionFailed. Os tipos de erros vistos com mais frequência incluem RangeError, ReferenceError, SyntaxError, TypeError, e URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 Ocorreu um erro no código JavaScript. Veja a string de falha para mais detalhes. N/A
steps.javascript.ScriptSecurityError 500 Ocorreu um erro de segurança quando o JavaScript foi executado. Consulte a string de falha para mais detalhes. N/A

Erros de implantação

Esses erros podem ocorrer quando você implanta um proxy que contém esta política.

Nome do erro Causa Correção
InvalidResourceUrlFormat Se o formato do URL do recurso especificado no <ResourceURL> ou no elemento <IncludeURL> da política JavaScript for inválido, a implantação do proxy da API falhará.
InvalidResourceUrlReference Se os elementos <ResourceURL> ou <IncludeURL> fizerem referência a um arquivo JavaScript que não existe, a implantação do proxy da API falhará. O arquivo de origem referenciado precisa existir no proxy, no ambiente ou no nível da organização da API.
WrongResourceType Esse erro ocorrerá durante a implantação se os elementos <ResourceURL> ou <IncludeURL> da política JavaScript se referirem a qualquer tipo de recurso diferente de jsc (arquivo JavaScript).
NoResourceURLOrSource A implantação da política JavaScript pode falhar com esse erro se o elemento <ResourceURL> não for declarado ou se o URL do recurso não estiver definido nesse elemento. O elemento <ResourceURL> é obrigatório. Ou o elemento <IncludeURL> é declarado, mas o URL do recurso não está definido nesse elemento. O elemento <IncludeURL> é opcional, mas, se declarado, o URL do recurso precisa ser especificado no elemento <IncludeURL>.

Variáveis de falha

Essas variáveis são definidas quando essa política aciona um erro no ambiente de execução. Para mais informações, consulte O que você precisa saber sobre erros de política.

Variáveis Onde Exemplo
fault.name="fault_name" fault_name é o nome da falha, conforme listado na tabela Erros de ambiente de execução acima. O nome da falha é a última parte do código de falha. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name é o nome especificado pelo usuário da política que causou a falha. javascript.JavaScript-1.failed = true

Exemplo de resposta de erro

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"",
    "detail": {
      "errorcode": "steps.javascript.ScriptExecutionFailed"
    }
  }
}

Exemplo de regra de falha

<FaultRule name="JavaScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(javascript.JavaScript-1.failed = true) </Condition>
</FaultRule>

Esquema

Cada tipo de política é definido por um esquema XML (.xsd). Para referência, os esquemas de política estão disponíveis no GitHub.

Temas relacionados

Artigos da comunidade Apigee

Consulte os seguintes artigos relacionados na Comunidade da Apigee: