Вы просматриваете документацию 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. Дополнительные сведения о переменных сообщения см. в справочнике по переменным .
Диагностика
Определите политику вызова службы, в которой произошла ошибка, и имя переменной, тип которой неверен. Оба этих элемента можно найти в элементе
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, где переменная была определена первой.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова службы. Например, политика «Назначить сообщение» обычно используется для создания и заполнения переменных в потоке прокси-сервера 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
не имеет типа message (в данном примере это строка), вы получаете код ошибки: steps.servicecallout.RequestVariableNotMessageType
.
Разрешение
Убедитесь, что переменная, установленная в элементе <Request>
в неудачной политике вызова службы, является переменной потока типа сообщения , которая существует, или, альтернативно, вы можете создать новую переменную типа сообщения непосредственно в политике вызова службы (как описано в документации по политике ) и используйте это.
Чтобы исправить политику, вам необходимо изменить элемент <Request>
, указав существующую или новую переменную типа message. Например, переменная GeocodingRequest
, установленная в политике назначения сообщений, имеет тип сообщения и прекрасно работает в политике вызова службы. Например:
<?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. Дополнительные сведения о переменных сообщения см. в справочнике по переменным .
Диагностика
Определите политику вызова службы, в которой произошла ошибка, и имя переменной, тип которой неверен. Оба эти элемента можно найти в элементе
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, где переменная была определена первой.
- В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова службы. Например, политика «Назначить сообщение» обычно используется для создания и заполнения переменных в потоке прокси-сервера 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) .