Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
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. Если переменная является строкой или имеет другой тип, отличный от типа сообщения, вы увидите эту ошибку.
Переменные типа сообщения представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge request, response и message имеют тип message. Подробнее о переменных в сообщениях…
диагностика;
Определите правило Service Callout, в котором произошла ошибка, и название переменной с неверным типом. Оба этих элемента можно найти в элементе
faultstringответа об ошибке. Например, в следующем тегеfaultstringназвание правила –ExecuteGeocodingRequest, а переменная –PostalCode:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"В XML-файле правила Service Callout, которое не удалось выполнить, убедитесь, что название переменной, заданной в элементе
<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 код, в котором впервые была определена переменная.
- В большинстве случаев проблемная переменная создается и заполняется в другом правиле, которое выполняется до правила вызова сервиса. Например, политика Assign Message часто используется для создания и заполнения переменных в потоке прокси-сервера 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> в неудачном правиле Service Callout, является переменной потока типа message, которая существует. Также можно создать новую переменную типа message непосредственно в правиле Service Callout (как описано в документации по правилам) и использовать ее.
Чтобы исправить нарушение правил, измените элемент <Request>, указав существующую или новую переменную типа message. Например, переменная GeocodingRequest, заданная в правиле "Назначить сообщение", имеет тип message и будет работать в правиле "Вызов сервиса". Пример:
<?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> правил вызова сервиса, не относится к типу запроса. Если переменная относится к типу сообщения ответа, строке или любому другому типу, вы увидите эту ошибку.
Переменные типа Сообщение представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge request, response и message имеют тип message. Подробнее о переменных в сообщениях…
диагностика;
Определите правило Service Callout, в котором произошла ошибка, и название переменной с неверным типом. Оба этих элемента можно найти в элементе
faultstringответа об ошибке. Например, в следующем тегеfaultstringназвание правила –ExecuteGeocodingRequest, а переменная –var_response:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"В XML-файле правила Service Callout, которое не удалось выполнить, убедитесь, что название переменной, заданной в элементе
<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 код, в котором впервые была определена переменная.
- В большинстве случаев проблемная переменная создается и заполняется в другом правиле, которое выполняется до правила вызова сервиса. Например, политика Assign Message часто используется для создания и заполнения переменных в потоке прокси-сервера API.
- Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
- Проверьте значение атрибута
type(если он есть). - Если атрибут
typeотсутствует, переменная считается строкой.
- Проверьте значение атрибута
- Если тип переменной не request message, то это и является причиной ошибки. Информацию о распространенных переменных и их типах можно найти в справочнике по переменным.
Предположим, что переменная 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>
ExecutionFailed
Код ошибки
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"
}
}
}
Возможные причины
Возможные причины ошибки:
| Cause | Описание |
| Недопустимый или неправильно отформатированный URL | Целевой URL в правиле Service Callout имеет неправильный формат или содержит недопустимое или недоступное имя хоста. |
| Ошибка внутреннего сервера | Внутренний сервер возвращает ответ об ошибке 4XX или 5XX. |
Причина: недействительный или неправильно сформированный URL
Целевой URL в правиле Service Callout имеет неправильный формат или содержит недопустимое или недоступное имя хоста.
диагностика;
Определите правило Service Callout, вызвавшее ошибку. Название правил указывается в элементе
faultstringответа об ошибке. Например, в приведенном ниже фрагменте кодаfaultstringназвание политики Service Callout, которая не сработала, –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://, но нет действительного имени хоста. Поэтому правило Service Callout не выполняется и возвращает ошибкуExecution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.
Разрешение
Убедитесь, что элемент <URL> в невыполненном правиле Service Callout содержит действительный URL с доступным именем хоста.
Чтобы исправить правило Service Callout, показанное выше, измените элемент <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.
диагностика;
Определите правило Service Callout, вызвавшее ошибку. Название правил указывается в элементе
faultstringответа об ошибке. Например, в приведенном ниже фрагментеfaultstringназвание политики Service Callout, которая не сработала, –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, следуйте инструкциям в руководствах по устранению ошибок времени выполнения.