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

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

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 de fluxo integradas do Apigee Edge request, response e message são do tipo Mensagem. 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&quo>t<; standalone="yes"?
    MessageValidation async="false" continueOnError="false&quo>t; en<abled=">;true" name="SO<AP-Message-V>alida<tion-1">;
       < DisplayName>SOAP <Messag>e Valid<ation-1>/Disp<layName
       > Properties/
        S<OAPMessage/
    > <   Sourcerequest/S>ource
        ResourceURLxsd://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.o>r<g/2003/05>/soap<-encoding"
    soap:Body
        shipOrder
        xmlns:xsi="http://www>.w3.o<rg/200>0/10/XMLS<chem>a-instance"<;
       > ship<To
        >    n<ameKa>rl Kalcks<tein>/name
        /sh<ipTo<>/span>
        items
     <      > item
           <     tit>l<eI love A>PIs/title
       <     >    <quanti>ty1/quant<ity
     >     <      >p<rice2.90/p>r<ice
          > < /item
        /it>ems
    /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=&quo>t;shi<pAddress"/
    ...
    xsd:complexTyp>e< name=">s<hipAddress"
    xsd:sequence
    xsd:element >n<ame="name" type="xsd:string&q>u<ot;/
    xsd:element name="street" type>=<"xsd:string"/
    xsd:element name=&quo>t<;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=&quo>t;shi<pAddress"/
...
xsd:complexTyp>e< name=">s<hipAddress"
xsd:sequence
xsd:element >n<ame="nam>e<" type=&quo>t;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.o>r<g/2003/05>/soap<-encoding"
soap:Body
    shipOrder xmlns:xsi="http://www>.w3.o<rg/200>0/10/XMLS<chem>a-instance"<;
   > shipTo
 <      > nameKarl Ka<lckstei>n/name
  <      s>treet1020 Parkway/stree<t
      >  address<Mountai>n V<iew, CA >94043</addres>s
   <     >countryUS<A/co>untry
    /sh<ipTo<>/span>
    items
 <      > item
       <     tit>l<eI love A>PIs/title
   <     >    <quanti>ty1/quant<ity
 >     <      >p<rice2.90/p>r<ice
      > < /item
    /it>ems
/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&quo>t<; standalone="yes"?
    MessageValidation async="false" continueOnError="false&quo>t; en<abled=">;true" name="SO<AP-Message-V>alida<tion-1">;
       < DisplayName>SOAP <Messag>e Valid<ation-1>/D<isplayName
    >    Properties/
        SOAPMessage/
        <Sourcereques>t</Source
     ResourceU>RLwsdl://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.o>r<g/2003/05>/<soap-encoding"
    soap:Body
    shipOrder
    xmlns:xsi="http://www>.w3<.org/2>000/1<0/XM>LSchema-instanc<e&quo>t;
      <shipTo>
        nameKar<l Kalck>stein</name
     >   street1020 Parkway/s<treet
      >  add<ressMou>nta<in View,> CA< 94043/>add<ress<>/span>
        c<ount>ryUSA/c<ountr>y
      /shipTo<
      ite>ms
        <item
       > <  titleI >love AP<Is/ti>tle
    <      >quant<ity1/>qua<ntity<>/span>
          price2.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=&qu>o<t;ISO-8859-1"?
    wsdl:definitions xmlns:wsdl="http://s>chema<s.xmlsoap.>org/wsd<l/"
        wsdl:types
          xsd:schema xmlns:xsd=&quo>t<;http://www.w3.org/2001/XMLSchema"
    xs>d<:element name="shipOrde>r<" type=>&<quot;order"/
    xsd:complexType name=">o<rder"
    xsd:sequence
    xsd:element name>=<"shipTo&>q<uot; type=">s<hipAddress"/
    xsd:element name>=<"items&>q<uot; type="cdItems"/
    /xsd:sequen>c<e
    /xsd:complexType
    xsd:complexType name=&quo>t<;shipAddress"
    xsd:sequence
    xsd:element n>a<me="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="shipAdd>ress&q<uot;`
..>.
seq<uence
    element name="name">; typ<e="xsd:string"/
    element na>me=&q<uot;street" type="xsd:string&qu>ot;/
<    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&quo>t<; standalone="yes"?
soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle=&>q<uot;http:>/</www.w3.org/2003/05/soap-encoding"
soap:Body
shipOrder xmlns:>xsi=&<quot;h>ttp://www<.w3.>org/2000/10/XML<Schem>a-instanc<e">;
    shipTo<
      >  nameKar<l Kalck>stein/name
        stre<et1020 P>arkwa<y/stree>t
   <     >addressMo<unta>in View, CA 9<4043/>address
   < /ship>To
    items
<        >i<tem
     >       titleI< love> API<s/titl>e
       <     >quant<ity1/q>uantity
            price2.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 r>eason: \"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 reas<on: \&>quot;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.o>r<g/2003/05>/<soap-encoding"
    soap:Body
    shipOrder xmlns:xsi="http://www>.w3<.org/2>000/1<0/XM>LSchema-instanc<e&quo>t;
      <shipTo>
        nameKar<l Kalck>stein</name
     >   street1020 Parkway/s<treet
      >  add<ressMou>nta<in View,> CA< 94043/>add<ress<>/span>
        c<ount>ryUSA/c<ountr>y
      /shipTo<
      item>s
        i<tem
        > < titleI l>ove API<s/tit>les
    <      >quant<ity1/>qua<ntity<>/span>
     <     price>2<.90/price
    > <   /item
      /it>ems
    /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>
...