Resolução de problemas de erros de tempo de execução de ServiceCallout

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

  1. 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 seguinte faultstring, o nome da política é ExecuteGeocodingRequest e a variável é PostalCode:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. 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 denominada PostalCode, que corresponde ao que está em faultstring:

    <?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>
    
  3. Determinar se esta variável é do tipo mensagem ou não:

    1. Localize o código no pacote do proxy de API, onde a variável foi definida pela primeira vez.
    2. 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.
    3. 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.
    4. 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

  1. 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 seguinte faultstring, 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"

  2. 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 denominada var_response, que corresponde ao que está em faultstring:

    <?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>
    
  3. Determine se a variável é do tipo de mensagem de pedido ou não:

    1. Localize o código no pacote do proxy de API, onde a variável foi definida pela primeira vez.
    2. 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.
    3. 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.
    4. 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

  1. 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 seguinte faultstring, o nome da política ServiceCallout com falha é ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. 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 protocolo http://, 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

  1. 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 seguinte faultstring, o nome da política ServiceCallout com falha é ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Examine o elemento faultstring no corpo da resposta de erro e verifique se existem códigos de resposta 4XX ou 5XX listados no elemento Reason. 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.