Solução de problemas de erro de ambiente de execução da política de validação de mensagens SOAP

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

SourceMessageNotAvailable

Código de erro

steps.messagevalidation.SourceMessageNotAvailable

Corpo da resposta de erro

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

Exemplo de corpo da resposta de erro

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

Causa

Este erro ocorre se a variável message especificada no elemento <Source> da política SOAPMessageValidation é:

  • Fora do escopo (não disponível no fluxo específico em que a política está sendo executada) ou
  • não é possível resolver (não está definida)

Por exemplo, esse erro ocorre se o elemento <Source> na política SOAPMessageValidation está definido como uma variável que não existe no fluxo em que a política é executada.

Diagnóstico

  1. Identifique o nome da política SOAPMessageValidation em que o erro ocorre e o nome da variável source da string de falha. Por exemplo, na string de falha a seguir, o nome da política SOAPMessageValidation é SOAP-Message-Validation-1 e a variável source é request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. No XML da política SOAPMessageValidation de falha, verifique se o nome da variável definido no elemento <Source> corresponde ao nome da variável identificado na string de falha (etapa 1 acima).

    Por exemplo, a seguinte política SOAPMessageValidation especifica uma variável chamada request no elemento <Source>, que corresponde ao que está na string de falha:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Determine se a variável usada no elemento <Source> está definida e disponível no fluxo em que a política SOAPMessageValidation está sendo executada.

    Se a variável for:

    • fora do escopo (não disponível no fluxo específico em que a política está sendo executada) ou
    • não é possível resolver (não está definida)

    essa é a causa do erro.

    Como exemplo, digamos que a política SOAPMessageValidation mostrada acima seja executada no fluxo de resposta. No entanto, a variável request usada no exemplo do elemento <Source> acima está disponível apenas no fluxo de request.

    Como a variável request não existe no fluxo de resposta, você recebe o seguinte erro:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

Resolução

Verifique se a variável definida no elemento <Source> da política SOAPMessageValidation de falha está definida e existe no fluxo em que a política é executada.

Para corrigir o exemplo mostrado acima, modifique o elemento <Source> para usar a variável response, que existe no fluxo de resposta:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

Código de erro

steps.messagevalidation.NonMessageVariable

Corpo da resposta de erro

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Exemplo de corpo da resposta de erro

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Causa

Esse erro ocorrerá se o elemento <Source> na política SOAPMessageValidation estiver definido como uma variável que não seja do tipo Message.

As variáveis do tipo Message representam solicitações e respostas HTTP completas. As variáveis integradas do fluxo da Apigee request, response e message são do tipo Message. Saiba mais sobre as variáveis de mensagem na Referência de variáveis.

Diagnóstico

  1. Identifique o nome da variável que não é resolvida como um tipo Message da string de falha. Por exemplo, na string de falha a seguir, o nome da variável é message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Examine todas as políticas SOAPMessageValidation no proxy de API específico em que a falha ocorreu. Pode haver uma ou mais políticas SOAPMessageValidation. Identifique uma ou mais políticas específicas SOAPMessageValidation em que a variável especificada no elemento <Source> corresponde ao nome da variável identificado na string de falha (etapa 1 acima).

    Por exemplo, a política a seguir define o elemento <Source> como uma variável chamada message.content, que corresponde ao que está na string de falha:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    Como a variável message.content não é do tipo Message, você receberá o erro:

    "faultstring": "Variable message.content does not resolve to a Message"
    

Resolução

Verifique se o elemento <Source> na política SOAPMessageValidation de falha está definido como uma variável do tipo Message existente no fluxo em que a política é executada.

Para corrigir a política, modifique o elemento <Source> para especificar uma variável do tipo Message. Por exemplo, na política SOAPMessageValidation de falha, é possível especificar o elemento <Source> como request:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

Failed

Código de erro

steps.messagevalidation.Failed

Corpo da resposta de erro

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Exemplo de corpo da resposta de erro

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Causa

Esse erro ocorrerá se a política SOAPMessageValidation não validar o payload da mensagem de entrada no esquema XSD ou na definição WSDL. Isso também ocorrerá se houver JSON ou XML malformado na mensagem de payload.

Veja a seguir algumas das possíveis causas que podem causar esse erro:

Causa Descrição
Payload XML não correspondente O payload XML de entrada não segue o esquema XSD especificado na política SoapMessageValidation.
Payload SOAP não correspondente O payload SOAP de entrada não segue a definição WSDL especificada na política SoapMessageValidation.
JSON ou XML malformado O payload SOAP de entrada não contém um XML ou JSON bem formado.

Causa: payload XML não correspondente

Esse erro ocorre se o payload XML de entrada não adere ao esquema XSD especificado no elemento <ResourceURL> da política SoapMessageValidation.

Exemplo de mensagem de erro

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifique o nome da política SOAPMessageValidation, o motivo da falha e o número da linha em que o payload XML não corresponde ao esquema XSD. Todas essas informações estão na string de falha. Por exemplo, na string de falha a seguir, o nome da política SOAPMessageValidation é SOAP-Message-Validation-1,, o motivo da falha é Expecting a child element but found none [Line 9] e o número da linha é 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Analise a política SOAPMessageValidation e confirme se ela usa um arquivo de definição de esquema XSD para validar as mensagens. Por exemplo, a seguinte política SOAPMessageValidation tem um arquivo de recurso XSD no elemento <ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Examine o payload de entrada no número da linha identificado na Etapa 1 acima para entender o que causou a falha.

    Amostra de payload XML de entrada

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    No exemplo mostrado acima, a linha 9 tem a tag final </shipTo>.

  4. Analise o arquivo de definição de esquema XML, Script-1.xsd, usado na política SOAPMessageValidation para ver como ficará o elemento <shipTo>:

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    De acordo com o XSD de amostra usado para validação, o elemento <shipTo> precisa ter os elementos filhos <name>, <street>, <address> e <country>. No entanto, o payload XML de entrada tem apenas um elemento filho <name>. Como resultado, você recebe o erro:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

Resolução

Há duas maneiras de resolver esse erro de validação:

Solução nº 1

Se você determinar que a definição de esquema XSD impõe limitações desnecessárias e apenas o elemento filho <name> é obrigatório no elemento <shipTo>, modifique o Script-1.xsd usado na política SOAPMessageValidation. Para validar o exemplo de payload acima, você pode modificar o arquivo XSD da seguinte forma:

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

Solução nº 2

Se o arquivo de definição XSD estiver correto, o payload XML de entrada poderá ser alterado para corresponder a xsd. Por exemplo, é possível modificar o payload para cumprir o xsd da seguinte maneira:

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

Causa: payload SOAP não correspondente

Esse erro ocorrerá se o payload SOAP de entrada não estiver em conformidade com a definição WSDL especificada no elemento <ResourceURL> da política SoapMessageValidation.

Exemplo de mensagem de erro

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifique o nome da política SOAPMessageValidation, o motivo da falha e o número da linha na qual o payload SOAP não corresponde à definição WSDL. Você encontra todas essas informações na string de falha. Por exemplo, na string de falha a seguir, o nome da política SOAPMessageValidation é SOAP-Message-Validation-1, o motivo da falha é \"Element name mismatch. Wildcard? [Line 11]\"" e o número da linha é 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Examine a política SOAPMessageValidation e confirme se ela usa um esquema wsdl para validar as mensagens. Por exemplo, a seguinte política SOAPMessageValidation tem um arquivo de recurso wsdl no elemento <ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. Examine o payload de entrada no número da linha identificado na Etapa 1 para entender o que causou a falha.

    Exemplo de payload SOAP de entrada

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    No exemplo mostrado acima, a linha 11 tem o elemento filho <country> no elemento <shipTo>.

  4. Examine o arquivo de definição WSDL, SOAP-Message-Validation-1.wsdl, usado na política SOAPMessageValidation para ver o que pode estar errado com o elemento filho <country> no elemento <shipTo>:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    De acordo com a definição WSDL usada para validação, o elemento <shipTo> não tem um elemento filho <country>. Como resultado, você recebe o erro:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

Resolução

Há duas maneiras de resolver esse erro de validação:

Solução nº 1

Se você determinar que a definição WSDL usada está incorreta, poderá alterar o SOAP-Message-Validation-1.wsdl usado na política SOAPMessageValidation. Para validar o exemplo de payload acima, você pode modificar o arquivo da seguinte maneira:

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

Solução nº 2

Se a definição WSDL estiver correta, o payload SOAP de entrada poderá ser alterado para corresponder à definição WSDL.

Por exemplo, é possível modificar o payload SOAP de entrada da seguinte maneira:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

Causa: JSON ou XML malformado

Esse erro ocorrerá se o payload SOAP de entrada não estiver em conformidade com a definição WSDL especificada no elemento <ResourceURL> da política SoapMessageValidation.

Exemplo de mensagem de erro

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifique o nome da política SOAPMessageValidation, o motivo da falha e o número da linha do payload XML que não corresponde à definição WSDL. Você encontra todas essas informações na string de falha. Por exemplo, na string de falha a seguir, o nome da política SOAPMessageValidation é SOAP-Message-Validation-1, o motivo da falha é Expected </title> at line 15(possibly around char 420): e o número da linha é 15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Examine o payload de entrada no número da linha identificado na Etapa 1 acima para entender o que causou a falha.

    Exemplo de payload SOAP de entrada

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    No exemplo mostrado acima, a linha 15 do XML de entrada tem o elemento <title>, mas não é fechada com uma tag final </title>.

Resolução

Para resolver o erro, verifique se o payload de entrada é válido e está formado corretamente.

Por exemplo, você pode modificar o payload XML da entrada da seguinte maneira:

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...