Política de JavaScript

Esta página aplica-se ao Apigee e ao Apigee Hybrid.

Ver documentação do Apigee Edge.

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

No seu código JavaScript personalizado, pode usar os objetos, os métodos e as propriedades do modelo de objetos JavaScript do Apigee. Pode obter, definir e remover variáveis no contexto do fluxo de proxy, executar lógica personalizada, realizar o processamento de falhas, extrair dados de pedidos ou respostas e editar dinamicamente o URL de destino do back-end. Também pode usar funções criptográficas básicas que estão disponíveis no modelo de objetos.

A política de JavaScript permite-lhe especificar um ficheiro de origem JavaScript para executar ou pode incluir código JavaScript diretamente na configuração da política através do elemento <Source>. De qualquer forma, o código JavaScript é executado quando o passo ao qual a política está anexada é executado.

Para a opção de ficheiro de origem, o código-fonte é sempre armazenado numa localização padrão no pacote de proxy: apiproxy/resources/jsc. Em alternativa, pode armazenar o código-fonte num ficheiro de recursos ao nível do ambiente ou da organização. Para ver instruções, consulte o artigo Ficheiros de recursos. Também pode carregar JavaScript através do editor de proxy da IU do Apigee.

A Apigee não recomenda a utilização da política de JavaScript para o seguinte:

  • Registo. A política MessageLogging é mais adequada para o registo com plataformas de registo de terceiros, como Splunk, Sumo e Loggly. Esta política também melhora o desempenho do proxy da API, uma vez que é executada no PostClientFlow depois de a resposta ser devolvida ao cliente.
  • Substituir políticas do Apigee. A política de JavaScript não substitui as capacidades das políticas do Apigee. Se as capacidades de que precisa estiverem disponíveis numa política do Apigee, use essa política em vez de implementar uma solução JavaScript personalizada. O código JavaScript personalizado pode não corresponder ao desempenho e à otimização das políticas do Apigee.

Os ficheiros de origem JavaScript têm de ter uma extensão .js.

O Apigee suporta a execução de JavaScript no motor JavaScript Rhino 1.7.13.

Esta política é uma política extensível e a utilização desta política pode ter implicações de custo ou utilização, consoante a sua licença do Apigee. Para ver informações sobre os tipos de políticas e as implicações de utilização, consulte Tipos de políticas.

Amostras

Reescreva o URL de destino

Um exemplo de utilização comum envolve a extração de dados de um corpo de pedido, o armazenamento dos mesmos numa variável de fluxo e, em seguida, a utilização dessa variável de fluxo noutro local no fluxo do proxy. Por exemplo, suponhamos que um utilizador introduz o respetivo nome num formulário HTML e o envia. Para extrair os dados do formulário e adicioná-los dinamicamente ao URL do serviço de back-end, use uma política de JavaScript.

  1. Na IU do Apigee, abra o proxy que criou no editor de proxies.
  2. Selecione o separador Desenvolver.
  3. No menu Novo, selecione Novo script.
  4. Na caixa de diálogo, selecione JavaScript e atribua o nome js-example ao script.
  5. Cole o código seguinte no editor de código e guarde o proxy. O objeto context está disponível para o código JavaScript em qualquer parte do fluxo do proxy. Obtém constantes específicas do fluxo, chama métodos get/set úteis e realiza outras operações. Este objeto faz parte do modelo de objeto JavaScript do Apigee. A variável de fluxo target.url é uma variável incorporada de leitura/escrita acessível no fluxo de pedido de destino. Quando define essa variável com o URL da API, o Apigee chama esse URL de back-end. Isto reescreve o URL de destino original, que era o URL especificado quando criou 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. Atribua um nome à política target-rewrite. Aceite as predefinições e guarde a política.
  8. Depois de selecionar o Preflow do ponto final do proxy no Navegador, a política é adicionada a esse fluxo.
  9. No Navegador, selecione Target Endpoint PreFlow.
  10. No Navigator, arraste a política de JavaScript para o lado do pedido do Ponto final de destino no editor de fluxo.
  11. e clique em Guardar.
  12. Substitua o nome da organização e o nome do proxy quando 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 XML da política de JavaScript usada neste exemplo. O elemento <ResourceURL> especifica o ficheiro de origem JavaScript a executar. Este padrão aplica-se a qualquer ficheiro de origem JavaScript: jsc://filename.js. Se o seu código JavaScript requerer 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>

Recupere o valor da propriedade do JavaScript

Pode adicionar um elemento <Property> na configuração e, em seguida, obter o respetivo valor com JavaScript em tempo de execução.

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

Em JavaScript, pode aceder ao valor da propriedade de política como uma propriedade do objeto Properties da seguinte forma:

  • 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 através de JavaScript. Em seguida, a função getVariable usa o nome da variável obtido para obter 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);

Processamento de erros

Para ver exemplos e uma discussão sobre as técnicas de processamento de erros que pode usar numa chamada JavaScript, consulte o artigo Forma correta de devolver um erro de uma política de JavaScript. As sugestões na comunidade do Apigee destinam-se apenas a fins informativos e não representam necessariamente as práticas recomendadas pela Google.

Referência do elemento

A referência de elementos descreve os elementos e os atributos da política de 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 Predefinição Presença
languageVersion

Especifica a versão da linguagem JavaScript em que o código está 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 gera este erro: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

N/A Obrigatória

A tabela seguinte descreve os atributos comuns a todos os elementos principais de políticas:

Atributo Descrição Predefinição Presença
name

O nome interno da política. O valor do atributo name pode conter letras, números, espaços, hífenes, sublinhados e pontos finais. Este valor não pode exceder 255 carateres.

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

N/A Obrigatória
continueOnError

Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas.

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

falso Opcional
enabled

Defina como true para aplicar a política.

Defina como false para desativar a política. A política não é aplicada, mesmo que permaneça associada a um fluxo.

verdadeiro Opcional
async

Este atributo foi descontinuado.

falso Descontinuado

Elemento <DisplayName>

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

<DisplayName>Policy Display Name</DisplayName>
Predefinição

N/A

Se omitir este elemento, é usado o valor do atributo name da política.

Presença Opcional
Tipo String

Elemento <IncludeURL>

Especifica um ficheiro de biblioteca JavaScript a carregar como uma dependência para o ficheiro JavaScript principal especificado com o elemento <ResourceURL> ou <Source>. A política avalia os scripts pela ordem em que são apresentados na política. O seu código pode usar os objetos, os métodos e as propriedades do modelo de objetos JavaScript.

Inclua mais do que um recurso de dependência JavaScript através de elementos <IncludeURL> adicionais.

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

Elemento <Property>

Especifica uma propriedade à qual pode aceder a partir do código JavaScript no tempo de execução.

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

Atributos

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

Especifica o nome da propriedade.

N/A Obrigatória

Exemplo

Veja o exemplo na secção Exemplos.

Elemento <ResourceURL>

Especifica o ficheiro JavaScript principal que é executado no fluxo da API. Pode armazenar este ficheiro no âmbito do proxy da API (em /apiproxy/resources/jsc no pacote do proxy da API ou na secção Scripts do painel Navegador do editor do proxy da API). Em alternativa, armazene-o nos âmbitos da organização ou do ambiente para reutilização em vários proxies de API, conforme descrito em Gerir recursos. O seu código pode usar os objetos, os métodos e as propriedades do modelo de objetos JavaScript.

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

Exemplo

Veja o exemplo na secção Exemplos.

Elemento <Source>

Pode inserir JavaScript diretamente na configuração XML da política. O código JavaScript inserido é executado quando a política é executada no fluxo da API.

Predefinição: Nenhum
Presença: É necessário <ResourceURL> ou <Source>. Se estiverem presentes <ResourceURL> e <Source>, a política ignora <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 de cliente HTTP criadas pela política de JavaScript.

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

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

Notas de utilização

Depurar código de 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 de depuração. Para ver detalhes e exemplos, consulte o artigo Depure JavaScript com declarações print().

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

  1. Abra a ferramenta de depuração e inicie uma sessão de rastreio para um proxy que contenha a sua política de JavaScript.
  2. Ligue ao proxy.
  3. Na ferramenta de depuração, clique em Resultados de todas as transações para abrir o painel de resultados.

    Resultado do painel All Transactions (Todas as transações) na ferramenta Apigee Trace, que apresenta declarações de impressão.

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

Variáveis de fluxo

Esta política não preenche variáveis por predefinição. No entanto, pode definir e obter variáveis de fluxo no seu código JavaScript chamando métodos no objeto context. Por exemplo:

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

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

Referência de erro

Esta secção descreve os códigos de falha e as mensagens de erro devolvidas, bem como as variáveis de falha definidas pelo Apigee quando esta política aciona um erro. É importante conhecer estas informações se estiver a desenvolver regras de falhas para resolver falhas. Para saber mais, consulte o artigo O que precisa de saber acerca dos erros de políticas e o artigo Processamento de falhas.

Erros de tempo de execução

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

Código de falha Estado de HTTP Causa Corrigir
steps.javascript.ScriptExecutionFailed 500 A política de JavaScript pode gerar muitos tipos diferentes de erros de ScriptExecutionFailed. Os tipos de erros mais comuns incluem: RangeError, ReferenceError, SyntaxError, TypeError e URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 Ocorreu um erro no código JavaScript. Consulte a string de falha para ver detalhes. N/A
steps.javascript.ScriptSecurityError 500 Ocorreu um erro de segurança quando o JavaScript foi executado. Consulte a string de falha para ver detalhes. N/A

Erros de implementação

Estes erros podem ocorrer quando implementa um proxy que contém esta política.

Nome do erro Causa Corrigir
InvalidResourceUrlFormat Se o formato do URL do recurso especificado no elemento <ResourceURL> ou <IncludeURL> da política JavaScript for inválido, a implementação do proxy de API falha.
InvalidResourceUrlReference Se os elementos <ResourceURL> ou <IncludeURL> fizerem referência a um ficheiro JavaScript que não existe, a implementação do proxy de API falha. O ficheiro de origem referenciado tem de existir ao nível do proxy de API, do ambiente ou da organização.
WrongResourceType Este erro ocorre durante a implementação se os elementos <ResourceURL> ou <IncludeURL> da política JavaScript fizerem referência a qualquer tipo de recurso que não seja jsc (ficheiro JavaScript).
NoResourceURLOrSource A implementação da política JavaScript pode falhar com este erro se o elemento <ResourceURL> não for declarado ou se o URL do recurso não for definido neste elemento. O elemento <ResourceURL> é um elemento obrigatório. Ou, o elemento <IncludeURL> é declarado, mas o URL do recurso não está definido neste elemento. O elemento <IncludeURL> é opcional, mas, se for declarado, o URL do recurso tem de ser especificado no elemento <IncludeURL>.

Variáveis de falha

Estas variáveis são definidas quando esta política aciona um erro no tempo de execução. Para mais informações, consulte o artigo O que precisa de saber sobre os erros de políticas.

Variáveis Onde Exemplo
fault.name="fault_name" fault_name é o nome da falha, conforme indicado na tabela Erros de tempo 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 utilizador da política que gerou 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íticas estão disponíveis no GitHub.

Tópicos relacionados

Artigos da comunidade do Apigee

Pode encontrar estes artigos relacionados na comunidade do Apigee: