Política de JavaScript

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

O que

Essa política permite adicionar um código JavaScript personalizado que é executado no contexto de um fluxo de proxy de API. No código JavaScript personalizado, você pode usar os objetos, métodos e propriedades de o modelo de objeto JavaScript do Apigee Edge. O modelo de objeto permite obter, definir e remover variáveis no contexto do fluxo de proxy. Também é possível usar funções criptográficas básicas fornecidas com o modelo de objeto.

Sobre

Há muitos casos de uso da política do JavaScript. Por exemplo, é possível receber e definir variáveis de fluxo, executar a lógica personalizada e executar o processamento de falhas, além de extrair dados de solicitações ou respostas, editar dinamicamente o URL de destino do back-end e muito mais. Essa política permite que você implementar um comportamento personalizado que não seja coberto por nenhuma outra política padrão do Edge. Na verdade, você pode usar uma política JavaScript para atingir muitos dos mesmos comportamentos implementados por outras políticas, como o AssignMessage e o ExtractVariable.

Um caso de uso que não recomendamos para a política JavaScript é o registro. A política de geração de registros de mensagens é muito mais adequada para geração de registros em plataformas de registro de terceiros, como Splunk, Sumo e Loggly. Você melhora o desempenho do proxy da API executando a política de geração de registros de mensagens no PostClientFlow, que é executada depois que a resposta é enviada de volta ao cliente.

A política do JavaScript permite especificar um arquivo de origem do JavaScript a ser executado ou incluir o código do JavaScript diretamente na configuração da política com 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 do JavaScript por meio do editor de proxy da IU da Apigee.

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

Consulte Software e versões compatíveis (em inglês) para a versão do JavaScript compatível no momento.

Vídeo

Assista a um breve vídeo para saber como criar uma extensão de política personalizada usando a política JavaScript.

Amostras

Reescrever o URL de destino

Veja um caso de uso comum: como 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. Digamos que você tenha um aplicativo onde o usuário insere o nome em um formulário HTML e o envia. Você quer que o proxy de API extraia os dados do formulário e os adicione dinamicamente ao URL usado para chamar o serviço de back-end. Como você faria isso em uma política JavsScript?

Observação: se você quiser testar este exemplo, suponha que você tenha criado um novo proxy no editor de proxy. Ao criá-lo, basta dar a ele um URL de serviço de back-end: http://www.example.com. Neste exemplo, vamos reescrever o URL do back-end dinamicamente. Se você não sabe como criar um novo proxy, consulte o tutorial de primeiros passos. .

  1. Na interface do Edge, 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 atribua um nome ao script, como js-example.
  5. Cole o código a seguir no editor de código e salve o proxy. O importante é observar o objeto context. Esse objeto está disponível para o código JavaScript em qualquer lugar no fluxo do proxy. É usado para receber constantes específicas do fluxo, chamar métodos get/set úteis e realizar mais operações. Esta parte do objeto é do Modelo de objeto JavaScript. Observe também que a variável de fluxo target.url é uma variável integrada de leitura/gravação que pode ser acessada no fluxo de solicitação de destino. Quando definimos essa variável com o URL da API, o Edge faz sua chamada de back-end para esse URL. Basicamente, reescrevemos o URL de destino original, que era o que você especificou 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. Dê um nome à política, como target-rewrite. Aceite os padrões e salve a política.
  8. Se você selecionar o pré-fluxo do endpoint do proxy no Navegador, verá que a política foi adicionada a esse fluxo.
  9. No Navegador, selecione o ícone 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. Chame a API da seguinte maneira, substituindo o nome da organização e o proxy corretos conforme apropriado:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Por fim, vejamos a definição de XML para a política JavaScript usada neste exemplo. É importante observar que o elemento <ResourceURL> é usado para especificar o arquivo de origem JavaScript a ser executado. Esse mesmo padrão é usado para qualquer arquivo com origem JavaScript: jsc://filename.js. Se o código JavaScript exigir inclusões, você poderá usar um ou mais elementos <IncludeURL> para fazer isso, conforme descrito posteriormente nesta referência.

<?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 o valor de propriedade do JavaScript

É possível adicionar um elemento <Property> na configuração e recuperar o valor do elemento 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 será recebido pelo JavaScript.

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

  • Configure a propriedade Aqui, 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 com JavaScript. Aqui, o valor recuperado, um nome de variável, é usado pela função getVariable para recuperar o valor da variável.
    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);
    

Como processar os erros

Para ver exemplos e uma discussão sobre técnicas de tratamento de erros que você pode usar em uma chamada de JavaScript, consulte esta postagem na comunidade Apigee. As sugestões oferecidas na comunidade da Apigee são apenas para fins informativos e não representam necessariamente as práticas recomendadas pela Apigee.


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>

<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">

Os atributos a seguir são específicos dessa política.

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

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

Observação: para contas de avaliação gratuita, o tempo de execução é limitado a 200 ms.

N/A Obrigatório

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

Atributo Descrição Padrão Presença
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.

falso 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.

falso Obsoleto

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.

Presença Opcional
Tipo String

Elemento <IncludeURL>

Especifica um arquivo da biblioteca do JavaScript que será carregado como dependência ao arquivo do JavaScript principal especificado com o elemento <ResourceURL> ou <Source>. Os scripts serão avaliados na ordem em que estão listados na política. 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 com elementos <IncludeURL> adicionais.

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

Exemplo

Veja o exemplo básico na seção Amostras.

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 será executado no fluxo da API. E possível armazenar esse arquivo no escopo do proxy da API (em /apiproxy/resources/jsc no pacote de proxy de API ou na seção "Scripts" do painel de navegação do editor de proxy de API) ou nos escopos da organização e de ambiente para a reutilização em vários proxies de API, conforme descrito em Arquivos de recurso. 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, <ResourceURL> será ignorado.
Tipo: String

Exemplo

Veja o exemplo básico na seção Amostras.

Elemento <Source>

Permite 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, <ResourceURL> será ignorado.
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 que você usa para configurar o TLS para um TargetEndpoint/TargetServer. Consulte Como configurar o TLS do Edge para o back-end para mais informações.

Notas de uso

Uma política JavaScript não contém um código real. Em vez disso, uma política JavaScript faz referência a um "recurso" JavaScript e define a etapa no fluxo da API em que o JavaScript é executado. Você pode faça o upload do seu script por meio do editor de proxy da interface de gerenciamento ou inclua-o no /resources/jsc em proxies de API que você desenvolve localmente.

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 Trace. Para detalhes e exemplos, consulte Debug with JavaScript print().

Para ver instruções de impressão no Trace:

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

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

É possível usar a função print() para gerar informações de depuração para a ferramenta Trace. Essa função está disponível diretamente por meio do modelo de objeto JavaScript. Para mais detalhes, consulte "Depurar JavaScript com instruções print()"

Variáveis de fluxo

Essa política não preenche nenhuma variável por padrão. No entanto, você pode definir (e receber) variáveis de fluxo no código JavaScript chamando métodos no objeto de contexto. Um padrão típico é assim:

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

O objeto de contexto faz parte do modelo de objeto JavaScript do Apigee Edge.

Referência de erros

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
steps.javascript.ScriptExecutionFailed 500 The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 An error occurred in the JavaScript code. See the fault string for details. N/A
steps.javascript.ScriptSecurityError 500 A security error occurred when the JavaScript executed. See the fault string for details. N/A

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidResourceUrlFormat If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails.
InvalidResourceUrlReference If the <ResourceURL> or the <IncludeURL> elements refer to a JavaScript file that does not exist, then the deployment of the API proxy fails. The referenced source file must exist either the API proxy, environment, or organization level.
WrongResourceType This error occurs during deployment if the <ResourceURL> or the <IncludeURL> elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file).
NoResourceURLOrSource The deployment of the JavaScript policy can fail with this error if the <ResourceURL> element is not declared or if the resource URL is not defined within this element. <ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared but the resource URL is not defined within this element. The <IncludeURL> element is optional but if declared, the resource URL must be specified within the <IncludeURL> element.

Fault variables

These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. javascript.JavaScript-1.failed = true

Example error response

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

Example fault rule

<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>

Schema

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: