Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. informacje.
RequestVariableNotMessageType
Kod błędu
steps.servicecallout.RequestVariableNotMessageType
Treść odpowiedzi błędu
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotMessageType" } } }
Przyczyna
Ten błąd występuje, jeśli zmienna określona w elemencie <Request>
w zasadach dotyczących objaśnień usługi nie jest typu komunikat. Ten błąd pojawi się, jeśli zmienna jest ciągiem znaków lub innym typem, który nie jest wiadomością.
Zmienne typu wiadomości reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Edge request
, response
i message
są typu komunikat. Więcej informacji o zmiennych wiadomości znajdziesz w artykule Informacje o zmiennych.
Diagnostyka
Wskaż zasadę objaśnienia usługi, w której wystąpił błąd, i podaj nazwę zmiennej, której typ jest nieprawidłowy. Oba te elementy znajdziesz w elemencie
faultstring
odpowiedzi błędu. Na przykład w tym tagufaultstring
nazwa zasady toExecuteGeocodingRequest
, a zmienna toPostalCode
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"
Sprawdź, czy nazwa zmiennej ustawionej w elemencie
<Request>
odpowiada nazwie zmiennej w ciągu błędu (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwiePostalCode
, która odpowiada zawartości w parametrzefaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="PostalCode"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Określ, czy ta zmienna ma typ komunikatu:
- Znajdź kod w pakiecie serwera proxy interfejsu API, w którym zmienna została zdefiniowana jako pierwsza.
- W większości przypadków może się okazać, że zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą objaśnienia usługi. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
- Gdy już poznasz zasadę, w ramach której zmienna jest zdefiniowana i wypełniana w pierwszej kolejności, musisz określić jej typ w ten sposób:
- Sprawdź wartość atrybutu
type
(jeśli istnieje). - Jeśli brak atrybutu
type
, zmienna jest uznawana za ciąg znaków.
- Sprawdź wartość atrybutu
- Jeśli zmienna ma typ inny niż komunikat (np. ciąg znaków), jest to przyczyna błędu. Więcej informacji o typowych zmiennych i ich rodzajach znajdziesz w artykule o zmiennych.
Załóżmy na przykład, że zmienna PostalCode
, do której odwołuje się zasada objaśnienia usługi, została utworzona w poniższych zasadach dotyczących przypisania wiadomości. Zwróć uwagę, że do PostalCode
przypisano wartość zmiennej przepływu request.queryparam.postalcode
. Ta wartość jest ciągiem znaków, ponieważ w przypisaniu zmiennej nie ma atrybutu type
.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Pamiętaj, że zmienna PostalCode
jest używana w elemencie <Request>
zasady dotyczącej objaśnienia usługi:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="PostalCode"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Komunikat PostalCode
nie jest typu (w tym przykładzie jest to ciąg znaków), dlatego otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotMessageType
.
Rozdzielczość
Upewnij się, że zmienna ustawiona w elemencie <Request>
w niezgodności zasady dotyczącej objaśnień usługi jest zmienną przepływu typu wiadomość. Możesz też utworzyć nową zmienną typu wiadomości bezpośrednio w zasadach dotyczących objaśnień usługi (zgodnie z opisem w dokumentacji zasad) i używać jej.
Aby poprawić zasadę, musisz zmodyfikować element <Request>
tak, aby określić istniejącą lub nową zmienną typu komunikat. Na przykład zmienna GeocodingRequest
ustawiona w zasadzie Przypisz wiadomość jest typu wiadomości i będzie działać prawidłowo z zasadą Objaśnienie usługi. Na przykład:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
RequestVariableNotRequestMessageType
Kod błędu
steps.servicecallout.RequestVariableNotRequestMessageType
Treść odpowiedzi błędu
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType" } } }
Przyczyna
Ten błąd występuje, jeśli zmienna określona w elemencie <Request>
zasady dotyczącej objaśnień usługi nie jest typem komunikatu z żądaniem. Ten błąd wystąpi, jeśli zmienna jest typem komunikatu odpowiedzi, ciągiem tekstowym lub innym typem.
Zmienne typu Wiadomość reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Edge request
, response
i message
są typu komunikat. Więcej informacji o zmiennych wiadomości znajdziesz w artykule Informacje o zmiennych.
Diagnostyka
Wskaż zasadę objaśnienia usługi, w której wystąpił błąd, i podaj nazwę zmiennej, której typ jest nieprawidłowy. Oba te elementy znajdziesz w elemencie
faultstring
odpowiedzi błędu. Na przykład w tym tagufaultstring
nazwa zasady toExecuteGeocodingRequest
, a zmienna tovar_response
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"
Sprawdź, czy nazwa zmiennej ustawionej w elemencie
<Request>
odpowiada nazwie zmiennej w ciągu błędu (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwievar_response
, która odpowiada zawartości w parametrzefaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="var_response"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Określ, czy zmienna ma typ wiadomości z żądaniem, czy nie:
- Znajdź kod w pakiecie serwera proxy interfejsu API, w którym zmienna została zdefiniowana jako pierwsza.
- W większości przypadków może się okazać, że zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą objaśnienia usługi. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
- Gdy już poznasz zasadę, w ramach której zmienna jest zdefiniowana i wypełniana w pierwszej kolejności, musisz określić jej typ w ten sposób:
- Sprawdź wartość atrybutu
type
(jeśli istnieje). - Jeśli brak atrybutu
type
, zmienna jest uznawana za ciąg znaków.
- Sprawdź wartość atrybutu
- Jeśli typ zmiennej jest inny niż wiadomość żądania, to jest przyczyną błędu. Więcej informacji o typowych zmiennych i ich rodzajach znajdziesz w artykule o zmiennych.
Załóżmy na przykład, że zmienna var_response
, do której odwołuje się zasada objaśnienia usługi, została utworzona w poniższych zasadach dotyczących przypisania wiadomości. Zwróć uwagę, że var_response
ma typ response
. Dlatego typem zmiennej var_response
jest komunikat z odpowiedzią.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<AssignTo createNew="true" type="response">var_response</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Pamiętaj, że zmienna var_response
jest używana w elemencie <Request>
zasady Objaśnienie usługi.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="var_response"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Komunikat var_response
z żądaniem nie jest typem komunikatu (jego typem jest odpowiedź i komunikat), dlatego otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotRequestMessageType
.
Rozdzielczość
Upewnij się, że zmienna ustawiona w elemencie <Request>
w niezgodności zasady dotyczącej objaśnienia usługi jest zmienną typu wiadomości z prośbą. Możesz też utworzyć nową zmienną typu wiadomości z żądaniem bezpośrednio w zasadach dotyczących objaśnień usługi (zgodnie z opisem w dokumentacji zasad) i używać jej.
Aby poprawić tę zasadę, musisz zmodyfikować element <Request>
tak, aby określić istniejącą lub nową zmienną typu komunikat z żądaniem. Będzie ona działać z zasadami dotyczącymi objaśnień usługi. Na przykład:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
ExecutionFailed
Kod błędu
steps.servicecallout.ExecutionFailed
Treść odpowiedzi błędu
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
lub
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
Możliwe przyczyny
Możliwe przyczyny tego błędu:
Przyczyna | Opis |
Nieprawidłowy lub uszkodzony adres URL | Docelowy URL w zasadzie objaśnienia usługi ma nieprawidłowy format albo zawiera nieprawidłową lub nieosiągalną nazwę hosta. |
Błąd serwera backendu | Serwer backendu zwraca odpowiedź błędu 4XX lub 5XX. |
Przyczyna: nieprawidłowy lub nieprawidłowy adres URL
Docelowy URL w zasadzie objaśnienia usługi ma nieprawidłowy format albo zawiera nieprawidłową lub nieosiągalną nazwę hosta.
Diagnostyka
Wskaż zasadę objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawi się w elemencie
faultstring
odpowiedzi o błędzie. Na przykład w tagufaultstring
niedziałająca zasada objaśnienia usługi nazywa sięExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]"
Przyjrzyj się elementowi
<URL>
w nieudanej zasadzie objaśnienia usługi. Jeśli host ma nieprawidłowy format albo ma nieprawidłową lub nieosiągalną nazwę hosta, to jest przyczyną tego błędu. Na przykład te zasady dotyczące objaśnienia usługi określają nieprawidłową wartość<URL>
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://</URL> </HTTPTargetConnection> </ServiceCallout>
Element
<URL>
ma tylko protokółhttp://
, ale nie ma prawidłowej nazwy hosta. Dlatego zasada Objaśnienia usługi kończy się błędem:Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable
.
Rozdzielczość
Upewnij się, że element <URL>
w nieprawidłowej zasadzie objaśnienia usługi ma prawidłowy adres URL i osiągalną nazwę hosta.
Aby poprawić powyższe zasady dotyczące objaśnień usługi, możesz zmodyfikować element <URL>
i określić w nim prawidłowy adres URL:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Przyczyna: błąd serwera backendu
Serwer backendu zwraca odpowiedź błędu 4XX lub 5XX.
Diagnostyka
Wskaż zasadę objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawi się w elemencie
faultstring
odpowiedzi o błędzie. Na przykład w tagufaultstring
niedziałająca zasada objaśnienia usługi nazywa sięExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]
Sprawdź
faultstring
w treści odpowiedzi o błędzie i sprawdź, czyReason
zawiera kody odpowiedzi 4XX lub 5XX. Na przykład poniższy ciąg błędu wyraźnie wskazuje, że serwer backendu zwrócił kod odpowiedzi 502:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
Rozdzielczość
Po określeniu kodu odpowiedzi błędu możesz rozwiązać ten problem tak samo jak w przypadku każdego błędu 4XX lub 5XX. Instrukcje rozwiązywania problemów z błędami 4XX i 5XX znajdziesz w poradnikach dotyczących błędów środowiska wykonawczego (4XX/5XX).