Вы просматриваете документацию 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" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="PostalCode"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>Определите, является ли эта переменная сообщением или нет:
- Найдите код в пакете API Proxy, где эта переменная была определена впервые.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
- После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута
type(если он присутствует). - Если атрибут
typeотсутствует, то переменная считается строкой.
- Проверьте значение атрибута
- Если тип переменной не является сообщением (например, строкой), то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .
В качестве примера предположим, что переменная PostalCode на которую ссылается политика вызова службы, была создана в следующей политике назначения сообщения. Обратите внимание, что PostalCode присваивается значение переменной потока request.queryparam.postalcode . Это значение является строкой, поскольку в присваивании переменной отсутствует атрибут 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>
Напомним, что переменная PostalCode используется в элементе <Request> политики вызова сервисной службы:
<?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>
Поскольку PostalCode не имеет типа сообщения (в этом примере это строка), вы получаете код ошибки: steps.servicecallout.RequestVariableNotMessageType .
Разрешение
Убедитесь, что переменная, заданная в элементе <Request> в политике неудачного вызова сервиса, является переменной потока типа сообщения , которая существует, или же вы можете создать новую переменную типа сообщения непосредственно в политике вызова сервиса (как описано в документации по политике ) и использовать ее.
Для исправления политики необходимо изменить элемент <Request> , указав существующую или новую переменную типа message. Например, переменная GeocodingRequest , заданная в политике Assign Message, имеет тип message и будет корректно работать в политике Service Callout. Например:
<?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
Код ошибки
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" 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>Определите, относится ли переменная к типу сообщения запроса или нет:
- Найдите код в пакете API Proxy, где эта переменная была определена впервые.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
- После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута
type(если он присутствует). - Если атрибут
typeотсутствует, то переменная считается строкой.
- Проверьте значение атрибута
- Если тип переменной не соответствует типу сообщения запроса , то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .
В качестве примера предположим, что переменная var_response на которую ссылается политика вызова службы, была создана в следующей политике назначения сообщений. Обратите внимание, что var_response присвоен тип response . Следовательно, тип переменной var_response — сообщение ответа.
<?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>
Напомним, что переменная var_response используется в элементе <Request> политики вызова сервиса.
<?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>
Поскольку var_response не имеет типа "сообщение запроса" (ее тип - "сообщение ответа"), вы получаете код ошибки: steps.servicecallout.RequestVariableNotRequestMessageType .
Разрешение
Убедитесь, что переменная, заданная в элементе <Request> в политике обработки неудачных вызовов сервиса, является существующей переменной типа сообщения запроса , или же вы можете создать новую переменную типа сообщения запроса непосредственно в политике обработки вызовов сервиса (как описано в документации по политике ) и использовать ее.
Для исправления политики необходимо изменить элемент <Request> , указав существующую или новую переменную типа "сообщение запроса", и это будет работать в политике вызова службы. Например:
<?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>
Выполнение завершилось с ошибкой.
Код ошибки
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" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://</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" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/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) .