Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do
Apigee Edge.
RequestVariableNotMessageType
Código de erro
steps.servicecallout.RequestVariableNotMessageType
Corpo da resposta de erro
{ "fault": { "faultstring": "ServiceCallout[POLICY_NAME]: request variable [VARIABLE_NAME] value is not of type Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotMessageType" } } }
Causa
Este erro ocorre se uma variável especificada no elemento <Request>
da política ServiceCallout não for do tipo message
. Se a variável for uma string ou qualquer outro tipo que não seja de mensagem, é apresentado este erro.
As variáveis de tipo de mensagem representam pedidos e respostas HTTP completos. As variáveis de fluxo incorporadas request
, response
e message
são do tipo message
.
Diagnóstico
Identifique a política ServiceCallout onde ocorreu o erro e o nome da variável cujo tipo está incorreto. Pode encontrar ambos os itens no elemento
faultstring
da resposta de erro. Por exemplo, no seguintefaultstring
, o nome da política éExecuteGeocodingRequest
e a variável éPostalCode
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"
No XML da política ServiceCallout com falha, verifique se o nome da variável definido no elemento
<Request>
corresponde ao nome da variável identificado na string de falha (passo n.º 1 acima). Por exemplo, a política seguinte especifica uma variável de pedido denominadaPostalCode
, que corresponde ao que está emfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="PostalCode"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Determinar se esta variável é do tipo mensagem ou não:
- Localize o código no pacote do proxy de API, onde a variável foi definida pela primeira vez.
- Na maioria dos casos, vai verificar que a variável de problema é criada e preenchida noutra política que é executada antes da política ServiceCallout. Por exemplo, a política Assign Message é usada frequentemente para criar e preencher variáveis num fluxo de proxy de API.
- Depois de descobrir a política na qual a variável é definida e preenchida primeiro, tem de determinar o tipo dessa variável da seguinte forma:
- Verifique o valor do atributo
type
(se estiver presente). - Se o atributo
type
não estiver presente, a variável é considerada uma string.
- Verifique o valor do atributo
- Se o tipo da variável não for uma mensagem (como uma string), essa é a causa do erro. Pode saber mais acerca das variáveis comuns e dos respetivos tipos na referência de variáveis de fluxo.
Por exemplo, suponha que a variável PostalCode
referenciada na política ServiceCallout foi criada na seguinte política AssignMessage. Tenha em atenção que a variável PostalCode
é atribuída ao valor da variável de fluxo request.queryparam.postalcode
. Este valor é uma string porque não existe nenhum atributo type
na atribuição de variáveis.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Agora, recorde que a variável PostalCode
é usada no elemento <Request>
da política ServiceCallout:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="PostalCode"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Uma vez que PostalCode
não é do tipo message (é uma string neste exemplo), recebe o código de erro: steps.servicecallout.RequestVariableNotMessageType
.
Resolução
Certifique-se de que a variável definida no elemento <Request>
na política ServiceCallout com falha é uma variável de fluxo do tipo message
que existe ou, em alternativa, pode criar uma nova variável do tipo de mensagem diretamente na política ServiceCallout (conforme explicado na política ServiceCallout) e usá-la.
Para corrigir a política, tem de modificar o elemento <Request>
para especificar uma variável existente ou nova do tipo mensagem. Por exemplo, a variável GeocodingRequest
definida na política Assign Message é do tipo mensagem e funcionaria bem na política ServiceCallout. Por exemplo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
RequestVariableNotRequestMessageType
Código de erro
steps.servicecallout.RequestVariableNotRequestMessageType
Corpo da resposta de erro
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType" } } }
Causa
Este erro ocorre se uma variável especificada no elemento <Request>
da política ServiceCallout não for do tipo message
. Se a variável for um tipo de mensagem de resposta, uma string ou qualquer outro tipo, é apresentado este erro.
A variável de tipo message
representa pedidos e respostas HTTP completos. As variáveis de fluxo incorporadas request
, response
e message
são do tipo message
.
Diagnóstico
Identifique a política ServiceCallout onde ocorreu o erro e o nome da variável cujo tipo está incorreto. Pode encontrar ambos os itens no elemento
faultstring
da resposta de erro. Por exemplo, no seguintefaultstring
, o nome da política éExecuteGeocodingRequest
e a variável évar_response
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"
No XML da política ServiceCallout com falha, verifique se o nome da variável definido no elemento
<Request>
corresponde ao nome da variável identificado na string de falha (passo n.º 1 acima). Por exemplo, a política seguinte especifica uma variável de pedido denominadavar_response
, que corresponde ao que está emfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="var_response"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Determine se a variável é do tipo de mensagem de pedido ou não:
- Localize o código no pacote do proxy de API, onde a variável foi definida pela primeira vez.
- Na maioria dos casos, vai verificar que a variável de problema é criada e preenchida noutra política que é executada antes da política ServiceCallout. Por exemplo, a política Assign Message é usada frequentemente para criar e preencher variáveis num fluxo de proxy de API.
- Depois de descobrir a política na qual a variável é definida e preenchida primeiro, tem de determinar o tipo dessa variável da seguinte forma:
- Verifique o valor do atributo
type
(se estiver presente). - Se o atributo
type
não estiver presente, a variável é considerada uma string.
- Verifique o valor do atributo
- Se o tipo da variável não for do tipo mensagem de pedido, essa é a causa do erro. Pode saber mais acerca das variáveis comuns e dos respetivos tipos na referência de variáveis de fluxo.
Por exemplo, suponha que a variável var_response
referenciada na política ServiceCallout foi criada na seguinte política Assign Message. Tenha em atenção que a variável var_response
recebe o tipo response
. Por isso, o tipo da variável var_response
é a mensagem de resposta.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<AssignTo createNew="true" type="response">var_response</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Lembre-se de que a variável var_response
é usada no elemento <Request>
da política ServiceCallout.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="var_response"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Uma vez que var_response
não é do tipo mensagem de pedido (o respetivo tipo é mensagem de resposta), recebe o código de erro: steps.servicecallout.RequestVariableNotRequestMessageType
.
Resolução
Certifique-se de que a variável definida no elemento <Request>
na política ServiceCallout com falha é uma variável do tipo message
que existe ou, em alternativa, pode criar uma nova variável do tipo de mensagem de pedido diretamente na política ServiceCallout (conforme explicado na política ServiceCallout) e usá-la.
Para corrigir a política, tem de modificar o elemento <Request>
para especificar uma variável existente ou nova do tipo mensagem de pedido, e vai funcionar na política ServiceCallout. Por exemplo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
ExecutionFailed
Código de erro
steps.servicecallout.ExecutionFailed
Corpo da resposta de erro
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
ou
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
Causas possíveis
As possíveis causas deste erro são:
Causa | Descrição |
URL inválido ou com formato incorreto | O URL de destino na política ServiceCallout tem um formato incorreto ou tem um nome de anfitrião inválido ou inacessível. |
Erro do servidor de back-end | O servidor de back-end devolve uma resposta de erro 4XX ou 5XX. |
Causa: URL inválido ou com formato incorreto
O URL de destino na política ServiceCallout tem um formato incorreto ou tem um nome de anfitrião inválido ou inacessível.
Diagnóstico
Identifique a política ServiceCallout que causou o erro. O nome da política aparece no elemento
faultstring
da resposta de erro. Por exemplo, no seguintefaultstring
, o nome da política ServiceCallout com falha éExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]"
Na política ServiceCallout com falha, examine o elemento
<URL>
. Se estiver malformado ou tiver um nome de anfitrião inválido ou inacessível, essa é a causa deste erro. Por exemplo, a seguinte política ServiceCallout especifica um<URL>
inválido:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://</URL> </HTTPTargetConnection> </ServiceCallout>
O elemento
<URL>
só tem o protocolohttp://
, mas não tem um nome de anfitrião válido. Por isso, a política ServiceCallout falha com o erro:Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable
.
Resolução
Certifique-se de que o elemento <URL>
na política ServiceCallout com falha tem um URL válido com um nome de anfitrião acessível.
Para corrigir a política ServiceCallout apresentada acima, pode modificar o elemento <URL>
para especificar um URL válido:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Causa: erro do servidor de back-end
O servidor de back-end devolve uma resposta de erro 4XX ou 5XX.
Diagnóstico
Identifique a política ServiceCallout que causou o erro. O nome da política aparece no elemento
faultstring
da resposta de erro. Por exemplo, no seguintefaultstring
, o nome da política ServiceCallout com falha éExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]
Examine o elemento
faultstring
no corpo da resposta de erro e verifique se existem códigos de resposta 4XX ou 5XX listados no elementoReason
. Por exemplo, o faultstring seguinte indica claramente que foi devolvido um código de resposta 502 do servidor de back-end:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
Resolução
Assim que determinar o código de resposta de erro, pode resolver este problema tal como faria com qualquer erro 4XX ou 5XX.