Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
SourceMessageNotAvailable
Kod błędu
steps.messagevalidation.SourceMessageNotAvailable
Treść odpowiedzi na błąd
{ "fault": { "faultstring": "source_var_name message is not available for[policy_name]", "detail": { "Errorcode": "steps.messagevalidation.SourceMessageNotAvailable" } } }
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
"detail": {
"errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
}
}
}
Przyczyna
Ten błąd występuje, jeśli zmienna message określona w elemencie <Source>
w zasadzie SOAPMessageValidation jest:
- poza zakresem (niedostępne w ramach konkretnego procesu, w którym są realizowane zasady) lub
- nie można rozwiązać (nie jest zdefiniowany)
Ten błąd może wystąpić na przykład wtedy, gdy element <Source>
w zasadach SOAPMessageValidation ma wartość zmiennej, która nie istnieje w przepływie, w którym są wykonywane zasady.
Diagnostyka
Określ nazwę zasady SOAPMessageValidation w miejscu, w którym występuje błąd, oraz nazwa zmiennej
source
z ciągu znaków błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation toSOAP-Message-Validation-1
, a zmiennasource
torequest
:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
W nieprawidłowym kodzie XML zasady SOAPMessageValidation sprawdź, czy nazwa zmiennej ustawiona w elemencie
<Source>
jest zgodna z nazwą zmiennej zidentyfikowaną w ciągu błędu (krok 1 powyżej).Na przykład ta zasada SOAPMessageValidation określa zmienną o nazwie
request
w elemencie<Source>
, która odpowiada zawartości ciągu błędu:<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>
Sprawdź, czy zmienna używana w elemencie
<Source>
jest zdefiniowana i dostępna w przepływie, w którym wykonywana jest zasada SOAPMessageValidation.Jeśli zmienna to:
- poza zakresem (niedostępne w ramach konkretnego procesu, w którym są realizowane zasady) lub
- nie można rozwiązać (nie jest zdefiniowany)
to jest jego przyczyną.
Na przykład załóżmy, że przedstawiona powyżej zasada SOAPMessageValidation jest wykonywana w przepływie odpowiedzi. Jednak zmienna
request
użyta w przykładzie powyżej elementu<Source>
jest dostępna tylko w procesie żądania.W przepływie odpowiedzi nie ma zmiennej
request
, dlatego pojawia się ten błąd:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
Rozdzielczość
Sprawdź, czy zmienna ustawiona w elemencie <Source>
w zasadach SOAPMessageValidation, która nie została wykonana, jest zdefiniowana i występuje w przepływie, w którym są wykonywane te zasady.
Aby poprawić powyższy przykład, możesz zmodyfikować element <Source
>, aby używać zmiennej response
, która występuje w przepływie odpowiedzi:
<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
Kod błędu
steps.messagevalidation.NonMessageVariable
Treść odpowiedzi na błąd
{ "fault": { "faultstring": "Variable var_name does not resolve to a Message" "detail": { "errorcode": "steps.messagevalidation.NonMessageVariable" } } }
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "Variable message.content does not resolve to a Message",
"detail": {
"errorcode": "steps.messagevalidation.NonMessageVariable"
}
}
}
Przyczyna
Ten błąd występuje, jeśli element <Source>
w zasadach SOAPMessageValidation ma wartość zmiennej, która nie jest typu Message.
Zmienne typu wiadomości reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Apigee Edge request
, response
i message
są typu Wiadomość. Więcej informacji o zmiennych wiadomości znajdziesz w artykule Informacje o zmiennych.
Diagnostyka
Określ nazwę zmiennej, która nie przechodzi do typu komunikatu, na podstawie ciągu błędu. Na przykład w tym ciągu błędu nazwa zmiennej to
message.content
:"faultstring": "Variable message.content does not resolve to a Message"
Sprawdź wszystkie zasady SOAPMessageValidation w przypadku konkretnego interfejsu API Proxy, w którym wystąpił błąd. Może istnieć co najmniej 1 zasada SOAPMessageValidation. Zidentyfikuj konkretną zasadę SOAPMessageValidation, w której zmienna określona w elemencie
<Source>
odpowiada nazwie zmiennej wskazanej w ciągu błędów (patrz krok 1 powyżej).Na przykład w tej regule element
<Source>
jest ustawiony na zmienną o nazwiemessage.content
, która pasuje do wartości w ciągu błędu:<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>
Zmienne
message.content
nie jest typu Message, dlatego pojawia się błąd:"faultstring": "Variable message.content does not resolve to a Message"
Rozdzielczość
Sprawdź, czy element <Source>
w nieprawidłowej zasadzie SOAPMessageValidation jest ustawiony na zmienną typu Message istniejącą w przepływie, w którym jest wykonywana zasada.
Aby poprawić tę zasadę, możesz zmodyfikować element <Source>
, aby określić zmienną typu Message. Na przykład w zasadzie nieudanego sprawdzania SOAPMessageValidation możesz określić element <Source>
jako 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>
Niepowodzenie
Kod błędu
steps.messagevalidation.Failed
Treść odpowiedzi na błąd
{ "fault": { "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num "detail": { "errorcode": "steps.messagevalidation.Failed" } } }
Przykładowa treść odpowiedzi na błąd
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Przyczyna
Ten błąd występuje, jeśli zasada SOAPMessageValidation nie sprawdza weryfikacji wejściowego ładunku komunikatów względem schematu XSD lub definicji WSDL. Błąd występuje również wtedy, gdy komunikat ładunku zawiera nieprawidłowy format JSON lub XML.
Oto kilka możliwych przyczyn, które mogą powodować ten błąd:
Przyczyna | Opis |
Niezgodny ładunek XML | Wejściowy ładunek XML jest niezgodny ze schematem XSD określonym w zasadzie SoapMessageValidation. |
Niezgodny ładunek SOAP | Wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną w zasadzie SoapMessageValidation. |
Nieprawidłowy format JSON lub XML | Dane wejściowe SOAP nie zawierają poprawnie sformatowanego kodu XML ani JSON. |
Przyczyna: niezgodność ładunku XML
Ten błąd występuje, jeśli wejściowy ładunek XML nie jest zgodny ze schematem XSD
określona w elemencie <ResourceURL>
zasady SoapMessageValidation.
Przykładowy komunikat o błędzie
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnostyka
Określ nazwę zasady SOAPMessageValidation, przyczynę błędu oraz numer wiersza, w którym ładunek XML nie jest zgodny ze schematem XSD. Wszystkie te informacje znajdują się w ciągu tekstowym błędu. Na przykład w tym ciągu błędów nazwa zasady SOAPMessageValidation to
SOAP-Message-Validation-1,
, przyczyna błędu toExpecting a child element but found none [Line 9]
, a numer wiersza to9
."faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
Sprawdź regułę SOAPMessageValidation i potwierdź, że do sprawdzania wiadomości używa ona pliku definicji schematu XSD. Na przykład ta zasada SOAPMessageValidation zawiera w elemencie
<ResourceURL>
plik zasobów XSD:<?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>
Sprawdź ładunek wejściowy na wierszu o numerze wskazanym w kroku 1, aby dowiedzieć się, co spowodowało błąd.
Przykładowy ładunek XML wejściowy
<?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>
W przykładzie powyżej wiersz 9 zawiera tag końcowy
</shipTo>
.Aby sprawdzić, jak powinien wyglądać element
<shipTo>
, przejrzyj plik definicji schematu XML (Script-1.xsd
) używany w zasadzie SOAPMessageValidation:... <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> ...
Zgodnie z przykładowym plikiem XSD używanym do weryfikacji, element
<shipTo>
musi zawiera elementy podrzędne<name>
,<street>
,<address>
i<country>
. Jednak kod XML wejściowy ma tylko 1 element podrzędny,<name>
. W efekcie pojawia się błąd:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
Rozdzielczość
Ten błąd weryfikacji można usunąć na 2 sposoby:
Rozwiązanie 1
Jeśli stwierdzisz, że definicja schematu XSD narzuca niepotrzebne ograniczenia i w elemencie <shipTo>
wymagany jest tylko element podrzędny <name>
, możesz zmodyfikować Script-1.xsd
używany w zasadzie SOAPMessageValidation. Aby zweryfikować przykładowy ładunek danych, możesz zmodyfikować plik XSD w ten sposób:
...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
Rozwiązanie 2
Jeśli plik definicji XSD jest poprawny, można zmienić dane wejściowe XML, aby pasowały do xsd
. Możesz na przykład zmodyfikować ładunek, aby był zgodny z dokumentem xsd
w ten sposób:
<?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>
Przyczyna: niezgodny ładunek SOAP
Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną w elemencie <ResourceURL>
w zasadach SoapMessageValidation.
Przykładowy komunikat o błędzie
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnostyka
Określ nazwę zasady SOAPMessageValidation, przyczynę błędu i numer wiersza, w którym ładunek SOAP nie odpowiada definicji WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w tym ciągu błędów nazwa zasady SOAPMessageValidation to
SOAP-Message-Validation-1
, przyczyna niepowodzenia to\"Element name mismatch. Wildcard? [Line 11]\""
, a numer wiersza to11
:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
Sprawdź regułę SOAPMessageValidation i potwierdź, że do sprawdzania wiadomości używa ona schematu
wsdl
. Na przykład ta zasada SOAPMessageValidation zawiera w elemencie<ResourceURL>
plik zasobówwsdl
:<?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>
Sprawdź ładunek wejściowy na wierszu o numerze wskazanym w kroku 1, aby dowiedzieć się, co spowodowało błąd.
Przykładowe wejściowe ładunki SOAP
<?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>
W przykładzie powyżej wiersz 11 zawiera element podrzędny
<country>
pod elementem<shipTo>
.Sprawdź plik definicji WSDL (
SOAP-Message-Validation-1.wsdl
) używany w zasadzie SOAPMessageValidation, aby sprawdzić, co może być nie tak z elementem podrzędnym<country>
w elemencie<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> ...
Zgodnie z definicją WSDL użytą do weryfikacji element
<shipTo>
nie ma elementu podrzędnego<country>
. W efekcie pojawia się błąd:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
Rozdzielczość
Ten błąd weryfikacji można usunąć na 2 sposoby:
Rozwiązanie 1
Jeśli stwierdzisz, że używana definicja WSDL jest nieprawidłowa, możesz zmienić SOAP-Message-Validation-1.wsdl
używane w zasadzie SOAPMessageValidation. Aby sprawdzić przykład ładunku powyżej, możesz zmodyfikować plik w ten sposób:
...
<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>
Rozwiązanie 2
Jeśli definicja WSDL jest prawidłowa, można zmienić wejściowy ładunek SOAP w taki sposób, aby był zgodny z definicją WSDL.
Możesz na przykład zmodyfikować wejściowy ładunek SOAP w ten sposób:
<?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>
Przyczyna: nieprawidłowy kod JSON lub XML
Ten błąd występuje, jeśli wejściowe dane SOAP nie są zgodne ze specyfikacją WSDL określoną w elemencie <ResourceURL>
w zasadach SoapMessageValidation.
Przykładowy komunikat o błędzie
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly around char 420)\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnostyka
Określ nazwę zasady SOAPMessageValidation, przyczynę błędu oraz numer wiersza ładunku XML, który nie jest zgodny z definicją WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w poniższym ciągu błędu nazwa zasady SOAPMessageValidation to
SOAP-Message-Validation-1
, przyczyna błędu toExpected </title> at line 15(possibly around char 420):
, a numer wiersza to15.
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly around char 420)\""
Aby dowiedzieć się, co spowodowało błąd, sprawdź dane wejściowe na linii wskazanej w kroku 1.
Przykładowy ładunek SOAP wejściowy
<?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>
W przykładzie pokazanym powyżej wiersz 15 w pliku XML zawiera element
<title>
, ale nie jest zamykany za pomocą tagu końcowego</title>
.
Rozdzielczość
Aby naprawić ten błąd, sprawdź, czy ładunek wejściowy jest prawidłowy i poprawnie sformatowany.
Możesz na przykład zmodyfikować wejściowy ładunek XML w ten sposób:
...
</shipTo>
<items>
<item>
<title>I love APIs</title>
<quantity>1</quantity>
<price>2.90</price>
</item>
</items>
...