Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
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 jest wykonywana zasada) lub
- nie może zostać rozwiązana (nie jest zdefiniowana).
Ten błąd występuje na przykład wtedy, gdy element <Source>
w zasadzie SOAPMessageValidation jest ustawiony na zmienną, której nie ma w przepływie, w którym jest wykonywana zasada.
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 podaną 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>
Określ, czy zmienna używana w elemencie
<Source>
jest zdefiniowana i dostępna w procesie, 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ść
Upewnij się, że zmienna ustawiona w elemencie <Source>
nieudanej zasady SOAPMessageValidation jest zdefiniowana i istnieje w przepływie, w którym jest wykonywana zasada.
Aby poprawić przykład powyżej, możesz zmodyfikować <Source
> element do użycia
zmienną response
istniejącą 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 zasadzie SOAPMessageValidation jest ustawiony na zmienną, 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 Message. Więcej informacji o zmiennych wiadomości znajdziesz w artykule o zmiennych.
Diagnostyka
Zidentyfikuj nazwę zmiennej, która nie jest rozpoznawana jako typ wiadomości z ciągu błędów. Na przykład w tym ciągu błędów nazwa zmiennej to
message.content
:"faultstring": "Variable message.content does not resolve to a Message"
Sprawdź wszystkie zasady SOAPMessageValidation na konkretnym serwerze proxy interfejsu API, na którym wystąpił błąd. Może istnieć co najmniej 1 zasada SOAPMessageValidation. Zidentyfikuj konkretną zasadę lub zasady SOAPMessageValidation, w których zmienna określona w elemencie
<Source>
odpowiada nazwie zmiennej określonej w ciągu błędu (krok 1 powyżej).Na przykład ta zasada ustawia element
<Source>
na zmienną o nazwiemessage.content
, 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>message.content</Source> <ResourceURL>xsd://Script-1.xsd</ResourceURL> </MessageValidation>
Zmienna
message.content
nie jest typu Wiadomość, więc pojawia się błąd:"faultstring": "Variable message.content does not resolve to a Message"
Rozdzielczość
Upewnij się, że element <Source>
w nieudanej regule SOAPMessageValidation jest ustawiony na zmienną typu Message, która występuje w przepływie, w którym działa zasada.
Aby poprawić tę zasadę, możesz zmodyfikować element <Source>
, aby określić zmienną typu Message. Na przykład w przypadku nieudanej zasady 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 tego błędu:
Przyczyna | Opis |
Niezgodny ładunek XML | Wejściowy ładunek XML jest niezgodny ze schematem XSD określonym w zasadzie SoapMessageValidation. |
Niezgodny ładunek SOAP | Dane wejściowe SOAP nie są zgodne z definicją WSDL określoną w zasadach SoapMessageValidation. |
Nieprawidłowy format JSON lub XML | Wejściowy ładunek SOAP nie zawiera 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 znaków błędu. Na przykład w tym ciągu błędu 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ź zasadę SOAPMessageValidation i potwierdź, że do weryfikacji wiadomości używa 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>
Aby dowiedzieć się, co spowodowało błąd, sprawdź dane wejściowe na linii wskazanej w kroku 1.
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>
.Sprawdź plik definicji schematu XML (
Script-1.xsd
) używany w zasadzie SOAPMessageValidation, aby zobaczyć, jak powinien wyglądać element<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> ...
Zgodnie z przykładowym plikiem XSD używanym do weryfikacji, element
<shipTo>
musi zawiera elementy podrzędne<name>
,<street>
,<address>
i<country>
. Jednak wejściowy ładunek XML ma tylko 1 element podrzędny:<name>
. W rezultacie 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 sprawdzić przykład ładunku powyżej, 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 prawidłowy, można zmienić wejściowy ładunek XML tak, aby był zgodny z plikiem xsd
. Możesz na przykład zmodyfikować ładunek, aby był zgodny z xsd
:
<?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: niezgodność ładunku SOAP
Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny ze wzorcem WSDL określonym w elemencie <ResourceURL>
zasady 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 oraz numer wiersza, w którym ładunek SOAP nie jest zgodny z definicją WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation to
SOAP-Message-Validation-1
, przyczyna błędu 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ź zasadę SOAPMessageValidation i upewnij się, że do weryfikacji wiadomości używa 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żywaną do weryfikacji element
<shipTo>
nie ma elementu podrzędnego<country>
. W rezultacie 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żywaną 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 poprawna, można zmienić wejściowy ładunek SOAP, aby pasował do definicji 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 format JSON lub XML
Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny ze wzorcem WSDL określonym w elemencie <ResourceURL>
zasady 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)\""
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</titles> <quantity>1</quantity> <price>2.90</price> </item> </items> </shipOrder> </soap:Body> </soap:Envelope>
W powyższym przykładzie wiersz 15 wejściowego kodu XML zawiera element
<title>
, ale nie jest zamknięty tagiem końcowym</title>
.
Rozdzielczość
Aby rozwiązać ten problem, upewnij się, że ładunek wejściowy jest prawidłowy i prawidłowo 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>
...