Устранение неполадок при возникновении ошибок во время выполнения вызова службы

Вы просматриваете документацию 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 см. справочник по переменным .

Диагноз

  1. Укажите политику вызова сервиса, в которой произошла ошибка, и имя переменной, тип которой указан неверно. Оба эти элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующем faultstring имя политики — ExecuteGeocodingRequest , а переменная — PostalCode :

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable PostalCode value is not of type Message"

  2. В 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>
    
  3. Определите, является ли эта переменная сообщением или нет:

    1. Найдите код в пакете API Proxy, где эта переменная была определена впервые.
    2. В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
    3. После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
      • Проверьте значение атрибута type (если он присутствует).
      • Если атрибут type отсутствует, то переменная считается строкой.
    4. Если тип переменной не является сообщением (например, строкой), то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .

В качестве примера предположим, что переменная 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 см. справочник по переменным .

Диагноз

  1. Укажите политику вызова сервиса, в которой произошла ошибка, и имя переменной, тип которой указан неверно. Оба эти элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующем faultstring имя политики — ExecuteGeocodingRequest , а переменная — var_response :

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable var_response value is not of type Message"

  2. В 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>
    
  3. Определите, относится ли переменная к типу сообщения запроса или нет:

    1. Найдите код в пакете API Proxy, где эта переменная была определена впервые.
    2. В большинстве случаев вы обнаружите, что проблемная переменная создается и заполняется в другой политике, которая выполняется до политики вызова сервиса. Например, политика назначения сообщения обычно используется для создания и заполнения переменных в потоке прокси-сервера API.
    3. После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
      • Проверьте значение атрибута type (если он присутствует).
      • Если атрибут type отсутствует, то переменная считается строкой.
    4. Если тип переменной не соответствует типу сообщения запроса , то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .

В качестве примера предположим, что переменная 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-адрес в политике вызова службы имеет некорректный формат или содержит недопустимое или недоступное имя хоста.

Диагноз

  1. Определите политику вызова сервиса, вызвавшую ошибку. Имя политики указано в элементе faultstring ответа об ошибке. Например, в следующем faultstring имя политики вызова сервиса, вызвавшей ошибку, — ExecuteGeocodingRequest .

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"

  2. В политике вызова сервиса, завершившейся ошибкой, проверьте элемент <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.

Диагноз

  1. Определите политику вызова сервиса, вызвавшую ошибку. Имя политики указано в элементе faultstring ответа об ошибке. Например, в следующем faultstring имя политики вызова сервиса, вызвавшей ошибку, — ExecuteGeocodingRequest .

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]

  2. Изучите faultstring в теле ответа и проверьте, есть ли в поле Reason какие-либо коды ответа 4XX или 5XX. Например, следующая строка ошибки ясно указывает на то, что от бэкэнд-сервера был возвращен код ответа 502:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

Разрешение

После определения кода ошибки вы можете устранить эту проблему так же, как и любую другую ошибку типа 4XX или 5XX. Для получения инструкций по устранению и решению проблем, связанных с ошибками 4XX или 5XX, обратитесь к руководствам по устранению ошибок времени выполнения (4XX/5XX) .