Pemecahan masalah error runtime kebijakan Validasi Pesan SOAP

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

SourceMessageNotAvailable

Kode Error

steps.messagevalidation.SourceMessageNotAvailable

Isi respons error

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

Contoh isi respons Error

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

Penyebab

Error ini terjadi jika variabel message yang ditentukan dalam elemen <Source> pada kebijakan SOAPMessageValidation adalah:

  • Di luar cakupan (tidak tersedia dalam alur spesifik tempat kebijakan dijalankan) atau
  • tidak dapat diselesaikan (tidak ditentukan)

Misalnya, error ini terjadi jika elemen <Source> dalam kebijakan SOAPMessageValidation disetel ke variabel yang tidak ada dalam alur tempat kebijakan dijalankan.

Diagnosis

  1. Identifikasi nama kebijakan SOAPMessageValidation tempat terjadinya error dan nama variabel source dari string fault. Misalnya, dalam string kesalahan berikut, nama kebijakan SOAPMessageValidation adalah SOAP-Message-Validation-1 dan variabel source adalah request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Pada XML kebijakan SOAPMessageValidation yang gagal, pastikan nama variabel yang ditetapkan dalam elemen <Source> cocok dengan nama variabel yang diidentifikasi dalam string kesalahan (Langkah 1 di atas).

    Misalnya, kebijakan SOAPMessageValidation berikut menentukan variabel bernama request di elemen <Source>, yang cocok dengan yang ada di string kesalahan:

    <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. Tentukan apakah variabel yang digunakan dalam elemen <Source> telah ditetapkan dan tersedia dalam flow tempat kebijakan SOAPMessageValidation dijalankan.

    Jika variabelnya adalah:

    • di luar cakupan (tidak tersedia di alur spesifik tempat kebijakan sedang dijalankan) atau
    • tidak dapat diselesaikan (tidak ditentukan)

    maka itulah penyebab {i>error.<i}

    Sebagai contoh, misalkan kebijakan SOAPMessageValidation yang ditampilkan di atas dijalankan di alur respons. Namun, variabel request yang digunakan dalam contoh elemen <Source> di atas hanya tersedia dalam alur permintaan.

    Karena variabel request tidak ada dalam alur respons, Anda akan menerima error berikut:

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

Resolusi

Pastikan variabel yang ditetapkan dalam elemen <Source> kebijakan SOAPMessageValidation yang gagal ditentukan dan ada di alur tempat kebijakan dijalankan.

Untuk memperbaiki contoh yang ditampilkan di atas, Anda dapat mengubah elemen <Source> untuk menggunakan variabel response, yang ada di alur respons:

<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

Kode Error

steps.messagevalidation.NonMessageVariable

Isi respons error

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

Contoh isi respons Error

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

Penyebab

Error ini terjadi jika elemen <Source> di kebijakan SOAPMessageValidation disetel ke variabel yang bukan jenis Message.

Variabel jenis pesan mewakili keseluruhan permintaan dan respons HTTP. Variabel alur Apigee Edge bawaan request, response, dan message berjenis Pesan. Untuk mempelajari variabel pesan lebih lanjut, baca artikel Referensi variabel.

Diagnosis

  1. Identifikasi nama variabel yang tidak menghasilkan jenis Pesan dari string kesalahan. Misalnya, dalam string kesalahan berikut, nama variabelnya adalah message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Periksa semua kebijakan SOAPMessageValidation di Proxy API tertentu tempat kegagalan terjadi. Mungkin ada satu atau beberapa kebijakan SOAPMessageValidation. Identifikasi kebijakan atau kebijakan SOAPMessageValidation tertentu dengan variabel yang ditentukan dalam elemen <Source> cocok dengan nama variabel yang diidentifikasi dalam string kesalahan (Langkah 1 di atas).

    Misalnya, kebijakan berikut menetapkan elemen <Source> ke variabel bernama message.content, yang cocok dengan yang ada di string fault:

    <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>
    

    Karena variabel message.content bukan merupakan jenis Pesan, Anda mendapatkan error:

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

Resolusi

Pastikan elemen <Source> dalam kebijakan SOAPMessageValidation yang gagal disetel ke variabel jenis Message yang ada di alur tempat kebijakan dijalankan.

Untuk memperbaiki kebijakan, Anda dapat mengubah elemen <Source> untuk menentukan variabel yang berjenis Pesan. Misalnya, dalam kebijakan SOAPMessageValidation yang gagal, Anda dapat menentukan elemen <Source> sebagai 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>

Gagal

Kode Error

steps.messagevalidation.Failed

Isi respons error

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

Contoh isi respons Error

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

Penyebab

Error ini terjadi jika kebijakan SOAPMessageValidation gagal memvalidasi payload pesan input terhadap definisi WSDL atau skema XSD. Error ini juga akan terjadi jika ada format JSON atau XML dalam pesan payload.

Berikut beberapa kemungkinan penyebab yang dapat menyebabkan error ini:

Penyebab Deskripsi
Payload XML yang tidak cocok Payload XML input tidak mematuhi skema XSD yang ditentukan dalam kebijakan SoapMessageValidation.
Payload SOAP tidak cocok Payload SOAP input tidak mematuhi definisi WSDL yang ditentukan dalam kebijakan SoapMessageValidation.
Format JSON atau XML salah Payload SOAP input tidak berisi XML atau JSON yang diformat dengan baik.

Penyebab: Payload XML yang tidak cocok

Error ini terjadi jika payload XML input tidak mematuhi skema XSD yang ditentukan dalam elemen <ResourceURL> kebijakan SoapMessageValidation.

Contoh Pesan Error

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

Diagnosis

  1. Identifikasi nama kebijakan SOAPMessageValidation, alasan kegagalan, dan nomor baris payload XML yang tidak cocok dengan skema XSD. Semua informasi ini ada di string fault. Misalnya, dalam string kesalahan berikut, nama kebijakan SOAPMessageValidation adalah SOAP-Message-Validation-1,alasan kegagalannya adalah Expecting a child element but found none [Line 9]: dan nomor barisnya adalah 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Periksa kebijakan SOAPMessageValidation dan pastikan bahwa kebijakan tersebut menggunakan file definisi skema XSD untuk memvalidasi pesan. Misalnya, kebijakan SOAPMessageValidation berikut memiliki file resource XSD di elemen <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. Periksa payload input pada nomor baris yang diidentifikasi pada Langkah 1 di atas untuk memahami penyebab kegagalan.

    Contoh payload XML Input

    <?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>
    

    Pada contoh yang ditunjukkan di atas, baris 9 memiliki tag akhir </shipTo>.

  4. Periksa file definisi skema XML, Script-1.xsd, yang digunakan dalam kebijakan SOAPMessageValidation untuk melihat tampilan elemen <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>
    ...
    

    Menurut contoh XSD yang digunakan untuk validasi, elemen <shipTo> harus memiliki elemen turunan <name>, <street>, <address>, dan <country>. Namun, payload XML input hanya memiliki satu elemen turunan, <name>. Akibatnya, Anda mendapatkan error:

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

Resolusi

Ada dua cara untuk mengatasi error validasi ini:

Solusi #1

Jika Anda menentukan bahwa definisi skema XSD menerapkan batasan yang tidak perlu dan hanya elemen turunan <name> yang diperlukan dalam elemen <shipTo>, Anda dapat mengubah Script-1.xsd yang digunakan dalam kebijakan SOAPMessageValidation. Untuk memvalidasi contoh payload di atas, Anda dapat memodifikasi file XSD sebagai berikut:

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

Solusi #2

Jika file definisi XSD sudah benar, payload XML input dapat diubah agar sesuai dengan xsd. Misalnya, Anda dapat mengubah payload agar mematuhi xsd sebagai berikut:

<?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>

Penyebab: Payload SOAP tidak cocok

Error ini terjadi jika payload SOAP input tidak mematuhi definisi WSDL yang ditentukan dalam elemen <ResourceURL> kebijakan SoapMessageValidation.

Contoh Pesan Error

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

Diagnosis

  1. Identifikasi nama kebijakan SOAPMessageValidation, alasan kegagalan, dan nomor baris saat payload SOAP tidak sesuai dengan definisi WSDL. Anda dapat menemukan semua informasi ini dari string kesalahan. Misalnya, dalam string kesalahan berikut, nama kebijakan SOAPMessageValidation adalah SOAP-Message-Validation-1, alasan kegagalannya adalah \"Element name mismatch. Wildcard? [Line 11]\"", dan nomor barisnya adalah 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Periksa kebijakan SOAPMessageValidation dan pastikan bahwa kebijakan tersebut menggunakan skema wsdl untuk memvalidasi pesan. Misalnya, kebijakan SOAPMessageValidation berikut memiliki file resource wsdl di elemen <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. Periksa payload input pada nomor baris yang diidentifikasi pada Langkah 1 untuk memahami penyebab kegagalan.

    Contoh Payload SOAP Input

    <?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>
    

    Pada contoh yang ditampilkan di atas, baris 11 memiliki elemen turunan <country> di bawah elemen <shipTo>.

  4. Periksa file Definisi WSDL, SOAP-Message-Validation-1.wsdl, yang digunakan dalam kebijakan SOAPMessageValidation untuk melihat masalah yang mungkin terjadi dengan elemen turunan <country> di bagian elemen <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>
    ...
    

    Menurut definisi WSDL yang digunakan untuk validasi, elemen <shipTo> tidak memiliki elemen turunan <country>. Akibatnya, Anda mendapatkan error:

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

Resolusi

Ada dua cara untuk mengatasi error validasi ini:

Solusi #1

Jika Anda menentukan bahwa definisi WSDL yang digunakan salah, Anda dapat mengubah SOAP-Message-Validation-1.wsdl yang digunakan dalam kebijakan SOAPMessageValidation. Untuk memvalidasi contoh payload di atas, Anda dapat memodifikasi file sebagai berikut:

...
<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>

Solusi #2

Jika definisi WSDL sudah benar, payload SOAP input dapat diubah agar sesuai dengan definisi WSDL.

Misalnya, Anda dapat mengubah payload SOAP input sebagai berikut:

<?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>

Penyebab: Format JSON atau XML salah

Error ini terjadi jika payload SOAP input tidak mematuhi definisi WSDL yang ditentukan dalam elemen <ResourceURL> kebijakan SoapMessageValidation.

Contoh Pesan Error

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

Diagnosis

  1. Identifikasi nama kebijakan SOAPMessageValidation, alasan kegagalan, dan nomor baris payload XML yang tidak sesuai dengan definisi WSDL. Anda dapat menemukan semua informasi ini di string kesalahan. Misalnya, pada string kesalahan berikut, nama kebijakan SOAPMessageValidation adalah SOAP-Message-Validation-1, alasan kegagalannya adalah Expected </title> at line 15(possibly around char 420):, dan nomor barisnya adalah15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Periksa payload input pada nomor baris yang diidentifikasi pada Langkah 1 di atas untuk memahami penyebab kegagalan.

    Contoh Payload SOAP Input

    <?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>
    

    Pada contoh yang ditunjukkan di atas, baris 15 XML input memiliki elemen <title>, tetapi tidak ditutup dengan tag akhir </title>.

Resolusi

Untuk mengatasi error, pastikan payload input valid dan diformat dengan benar.

Misalnya, Anda dapat memodifikasi payload XML input sebagai berikut:

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