Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
RequestVariableNotMessageType
Код ошибки
steps.servicecallout.RequestVariableNotMessageType
Тело ответа об ошибке
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotMessageType" } } }
Причина
Эта ошибка возникает, если переменная, указанная в элементе <Request> политики вызова службы , не имеет типа message . Если переменная является строкой или любым другим типом, отличным от message, вы увидите эту ошибку.
Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge — request , response и message имеют тип message. Для получения дополнительной информации о переменных типа Message см. справочник по переменным .
Диагноз
Укажите политику вызова сервиса, в которой произошла ошибка, и имя переменной, тип которой указан неверно. Оба эти элемента можно найти в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики —ExecuteGeocodingRequest, а переменная —PostalCode:"faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable PostalCode value is not of type Message"В XML-файле политики обработки неудачных вызовов сервиса убедитесь, что имя переменной, заданной в элементе
<Request>совпадает с именем переменной, указанным в строке ошибки (шаг № 1 выше). Например, следующая политика указывает переменную запроса с именемPostalCode, которая совпадает с именем вfaultstring:<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;< Req>uest variable=&qu<ot;Postal>Code&<quot;/ ResponseG>eocodingR<esp>onse/Response HTTPTargetConnection U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL /HTTPTargetConnection /ServiceCalloutОпределите, является ли эта переменная сообщением или нет:
- Найдите код в пакете API Proxy, где эта переменная была определена впервые.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
- После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута
type(если он присутствует). - Если атрибут
typeотсутствует, то переменная считается строкой.
- Проверьте значение атрибута
- Если тип переменной не является сообщением (например, строкой), то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .
В качестве примера предположим, что переменная PostalCode на которую ссылается политика вызова службы, была создана в следующей политике назначения сообщения. Обратите внимание, что PostalCode присваивается значение переменной потока request.queryparam.postalcode . Это значение является строкой, поскольку в присваивании переменной отсутствует атрибут type .
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
>AssignTo createN<ew=">true&<quo>t; type=&<quot;reques>t"Geocod<ingRequest/AssignTo
S>et
QueryParams
< QueryPa>ram name=&quo<t;address"{request.>queryparam.postalcode}/Query<Param
> QueryP<aram name="region&q>uot;{<request.que>ryparam.c<ountry}/Quer>yParam
< > < Qu>eryPa<ram >name=<"sensor&q>uot;false</Que>ryParam
< > /QueryPa<ram>s
VerbGET/Verb
/S<et
> As<signVariable
> < NamePostalCod>e/Name
< > Refre<quest>.querypar<am.>postalcode/Ref
/Assign<Vari>able
< AssignVaria>b<le
Nam>eCountry/Name
Refrequest.queryparam.country/Ref
/AssignVariable
/AssignMessage
Напомним, что переменная PostalCode используется в элементе <Request> политики вызова сервисной службы:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
Req>uest variable=&qu<ot;Postal>Code&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
Поскольку PostalCode не имеет типа сообщения (в этом примере это строка), вы получаете код ошибки: steps.servicecallout.RequestVariableNotMessageType .
Разрешение
Убедитесь, что переменная, заданная в элементе <Request> в политике неудачного вызова сервиса, является переменной потока типа сообщения , которая существует, или же вы можете создать новую переменную типа сообщения непосредственно в политике вызова сервиса (как описано в документации по политике ) и использовать ее.
Для исправления политики необходимо изменить элемент <Request> , указав существующую или новую переменную типа message. Например, переменная GeocodingRequest , заданная в политике Assign Message, имеет тип message и будет корректно работать в политике Service Callout. Например:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
RequestVariableNotRequestMessageType
Код ошибки
steps.servicecallout.RequestVariableNotRequestMessageType
Тело ответа об ошибке
{
"fault": {
"faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
"detail": {
"errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
}
}
}
Причина
Эта ошибка возникает, если переменная, указанная в элементе <Request> политики вызова службы , не имеет типа сообщения запроса . Если переменная имеет тип сообщения ответа, строки или любого другого типа, вы увидите эту ошибку.
Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge — request , response и message имеют тип message. Для получения дополнительной информации о переменных типа Message см. справочник по переменным .
Диагноз
Укажите политику вызова сервиса, в которой произошла ошибка, и имя переменной, тип которой указан неверно. Оба эти элемента можно найти в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики —ExecuteGeocodingRequest, а переменная —var_response:"faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable var_response value is not of type Message"В XML-файле политики обработки неудачных вызовов сервиса убедитесь, что имя переменной, заданной в элементе
<Request>совпадает с именем переменной, указанным в строке ошибки (шаг #1 выше). Например, следующая политика указывает переменную запроса с именемvar_response, которая совпадает с именем вfaultstring:<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot; < Reque>st variable="<;var_resp>onse&<quot;/ ResponseG>eocodingR<esp>onse/Response HTTPTargetConnection U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL /HTTPTargetConnection /ServiceCalloutОпределите, относится ли переменная к типу сообщения запроса или нет:
- Найдите код в пакете API Proxy, где эта переменная была определена впервые.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
- После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута
type(если он присутствует). - Если атрибут
typeотсутствует, то переменная считается строкой.
- Проверьте значение атрибута
- Если тип переменной не соответствует типу сообщения запроса , то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .
В качестве примера предположим, что переменная var_response на которую ссылается политика вызова службы, была создана в следующей политике назначения сообщений. Обратите внимание, что var_response присвоен тип response . Следовательно, тип переменной var_response — сообщение ответа.
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
>AssignTo createN<ew=">true&<quot; type="request"GeocodingRe>quest/Assign<To
As>signT<o c>reateNew=<"true&>quot; type=&q<uot;response"var_res>ponse/AssignTo
Set
<QueryParams>
<QueryParam name="ad>dress"{request.querypar<am.postalco>de}/QueryPara<m
QueryParam> name<="regi>on"{<request.quer>yparam.co<untr>y}/<Query>Param<
> < QueryParam> name=&qu<ot;s>ensor"<;fals>e/QueryPa<ram>
/QueryParams
< Ver>bGET/<Verb
/Set
> As<signVariable
> Na<mePo>stalCod<e/Nam>e
< Re>frequest.queryparam.postal<code>/Ref
< /AssignVari>a<ble
Assign>Variable
NameCountry/Name
Refrequest.queryparam.country/Ref
/AssignVariable
/AssignMessage
Напомним, что переменная var_response используется в элементе <Request> политики вызова сервиса.
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
< Reque>st variable="<;var_resp>onse&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
Поскольку var_response не имеет типа "сообщение запроса" (ее тип - "сообщение ответа"), вы получаете код ошибки: steps.servicecallout.RequestVariableNotRequestMessageType .
Разрешение
Убедитесь, что переменная, заданная в элементе <Request> в политике обработки неудачных вызовов сервиса, является существующей переменной типа сообщения запроса , или же вы можете создать новую переменную типа сообщения запроса непосредственно в политике обработки вызовов сервиса (как описано в документации по политике ) и использовать ее.
Для исправления политики необходимо изменить элемент <Request> , указав существующую или новую переменную типа "сообщение запроса", и это будет работать в политике вызова службы. Например:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
Выполнение завершилось с ошибкой.
Код ошибки
steps.servicecallout.ExecutionFailed
Тело ответа об ошибке
{
"fault": {
"faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
"detail": {
"errorcode": "steps.servicecallout.ExecutionFailed"
}
}
}
или
{
"fault": {
"faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
"detail": {
"errorcode": "steps.servicecallout.ExecutionFailed"
}
}
}
Возможные причины
Возможные причины этой ошибки:
| Причина | Описание |
| Недействительный или неправильно сформированный URL-адрес | Целевой URL-адрес в политике вызова службы имеет некорректный формат или содержит недопустимое или недоступное имя хоста. |
| Ошибка на бэкэнд-сервере | Серверная часть возвращает сообщение об ошибке с кодом 4XX или 5XX. |
Причина: Недействительный или некорректный URL-адрес
Целевой URL-адрес в политике вызова службы имеет некорректный формат или содержит недопустимое или недоступное имя хоста.
Диагноз
Определите политику вызова сервиса, вызвавшую ошибку. Имя политики указано в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики вызова сервиса, вызвавшей ошибку, —ExecuteGeocodingRequest."faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"В политике вызова сервиса, завершившейся ошибкой, проверьте элемент
<URL>. Если он имеет некорректный формат или содержит недопустимое или недоступное имя хоста, то это и является причиной ошибки. Например, следующая политика вызова сервиса указывает недопустимый<URL>:<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest" > R<equest v>ariable="Geo<codingReq>uest&<quot;/ ResponseG>eocodingR<esp>onse/Re<spon>se < HTTPTargetConnectio>n< URLhtt>p:///URL /HTTPTargetConnection /ServiceCalloutЭлемент
<URL>содержит только протоколhttp://, но не имеет допустимого имени хоста; поэтому политика вызова службы завершается с ошибкой:Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.
Разрешение
Убедитесь, что элемент <URL> в политике неудачного вызова службы содержит действительный URL-адрес с доступным именем хоста.
Чтобы исправить политику вызова сервиса, показанную выше, вы можете изменить элемент <URL> , указав действительный URL-адрес:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
Причина: ошибка бэкэнд-сервера.
Серверная часть возвращает сообщение об ошибке с кодом 4XX или 5XX.
Диагноз
Определите политику вызова сервиса, вызвавшую ошибку. Имя политики указано в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики вызова сервиса, вызвавшей ошибку, —ExecuteGeocodingRequest."faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]Изучите
faultstringв теле ответа и проверьте, есть ли в полеReasonкакие-либо коды ответа 4XX или 5XX. Например, следующая строка ошибки ясно указывает на то, что от бэкэнд-сервера был возвращен код ответа 502:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
Разрешение
После определения кода ошибки вы можете устранить эту проблему так же, как и любую другую ошибку типа 4XX или 5XX. Для получения инструкций по устранению и решению проблем, связанных с ошибками 4XX или 5XX, обратитесь к руководствам по устранению ошибок времени выполнения (4XX/5XX) .