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.
- Na IU do Apigee, abra o proxy que criou no editor de proxies.
- Selecione o separador Desenvolver.
- No menu Novo, selecione Novo script.
- Na caixa de diálogo, selecione JavaScript e atribua o nome
js-exampleao script. - Cole o código seguinte no editor de código e guarde o proxy. O objeto
contextestá disponível para o código JavaScript em qualquer parte do fluxo do proxy. Obtém constantes específicas do fluxo, chama métodosget/setúteis e realiza outras operações. Este objeto faz parte do modelo de objeto JavaScript do Apigee. A variável de fluxotarget.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); }
- No menu Nova política, selecione JavaScript.
- Atribua um nome à política
target-rewrite. Aceite as predefinições e guarde a política. - Depois de selecionar o Preflow do ponto final do proxy no Navegador, a política é adicionada a esse fluxo.
- No Navegador, selecione Target Endpoint PreFlow.
- No Navigator, arraste a política de JavaScript para o lado do pedido do Ponto final de destino no editor de fluxo.
- e clique em Guardar.
- 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
getVariableusa 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 | 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:
|
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 Opcionalmente, use o elemento |
N/A | Obrigatória |
continueOnError |
Definido como Definido como |
falso | Opcional |
enabled |
Defina como Defina como |
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 |
|---|---|
| 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:
- Abra a ferramenta de depuração e inicie uma sessão de rastreio para um proxy que contenha a sua política de JavaScript.
- Ligue ao proxy.
- Na ferramenta de depuração, clique em Resultados de todas as transações para abrir o painel de resultados.

- 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. |
build |
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. |
build |
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. |
build |
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). |
build |
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>. |
build |
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: