Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a 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 do 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
Reescrever 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 do fluxo
Por predefinição, esta política não preenche nenhuma variável. 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
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee 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. |
build |
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. |
build |
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. |
build |
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). |
build |
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. |
build |
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>
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: