Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
O quê
A política de script Python permite-lhe adicionar funcionalidades Python personalizadas ao fluxo do proxy de API, especialmente quando a funcionalidade de que precisa está além do que as políticas prontas a usar do Apigee oferecem.
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.
O suporte do idioma Python é fornecido através do Jython versão 2.5.2. As bibliotecas de terceiros que adicionar têm de ser "Python puro" (implementadas apenas em Python). Para mais informações sobre como adicionar bibliotecas, consulte o artigo Ficheiros de recursos.
Uma política do Python não contém código real. Em alternativa, uma política Python faz referência a um recurso Python e define o passo no fluxo da API em que o guião Python é executado. Pode carregar
o script através do editor de proxy da IU do Apigee ou incluí-lo no diretório
/resources/py
em proxies de API que desenvolve localmente.
Amostras
Política e script Python
Política de scripts Python
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Script name="Python-1"> <DisplayName>Python-1</DisplayName> <ResourceURL>py://myscript.py</ResourceURL> </Script>
Neste exemplo, o elemento ResourceURL especifica o recurso de script Python relevante.
Script Python
Isto mostra o que pode incluir no próprio script Python.
import base64 username = flow.getVariable("request.formparam.client_id") password = flow.getVariable("request.formparam.client_secret") base64string = base64.encodestring('%s:%s' % (username, password))[:-1] authorization = "Basic "+base64string flow.setVariable("authorizationParam",authorization)
Referência do elemento
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Script name="Python-1"> <DisplayName>Python-1</DisplayName> <ResourceURL>py://myscript.py</ResourceURL> <IncludeURL>py://myscript_dependency.py</IncludeURL> </Script>
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 Opcionalmente, use o elemento |
N/A | Obrigatório |
continueOnError |
Defina como Defina como |
false | Opcional |
enabled |
Defina como Defina como |
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 |
---|---|
Presence | Opcional |
Tipo | String |
Elemento <ResourceURL>
Este elemento especifica o ficheiro Python principal que vai ser executado no fluxo da API. Pode armazenar este ficheiro no âmbito do proxy de API (em /apiproxy/resources/py
no pacote do proxy de API ou na secção Scripts do painel Navigator do editor do proxy de API) ou nos âmbitos da organização ou do ambiente para reutilização em vários proxies de API, conforme descrito em Ficheiros de recursos. O seu código pode usar os objetos, os métodos e as propriedades do modelo de objetos JavaScript.
<ResourceURL>py://myscript.py</ResourceURL>
Predefinição: | Nenhum |
Presença: | Obrigatória |
Tipo: | String |
Elemento<IncludeURL>
Especifica um ficheiro Python a ser carregado como dependência do ficheiro Python principal especificado com o elemento <ResourceURL>
. Os scripts são avaliados pela ordem em que
são apresentados na política.
Inclua mais do que um recurso de dependência do Python com elementos <IncludeURL>
adicionais.
<IncludeURL>py://myscript_dependency.py</IncludeURL>
Predefinição: | Nenhum |
Presença: | Opcional |
Tipo: | String |
Códigos de erro
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.script.ScriptEvaluationFailed |
500 |
A política PythonScript pode gerar vários tipos diferentes de erros ScriptExecutionFailed. Alguns dos tipos de erros mais comuns são NameError e ZeroDivisionError. | build |
Erros na 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 PythonScript for inválido, a implantação do proxy da API falhará. |
build |
InvalidResourceUrlReference |
Se os elementos <ResourceURL> ou <IncludeURL>
fizerem referência a um arquivo PythonScript 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. |
build |
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" |
pythonscript.policy_name.failed |
policy_name é o nome especificado pelo usuário da política que causou a falha. | pythonscript.PythonScript-1.failed = true |
Exemplo de resposta de erro
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Pythonscript runtime error: "ReferenceError: "status" is not defined.\"", "detail": { "errorcode": "steps.script.ScriptExecutionFailed" } } }
Exemplo de regra de falha
<FaultRule name="PythonScript Policy Faults"> <Step> <Name>AM-CustomErrorResponse</Name> <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition> </Step> <Condition>(pythonscript.PythonScript-1.failed = true) </Condition> </FaultRule>