Как устранять ошибки выполнения выносок с описанием услуг

Вы просматриваете документацию по 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. Подробнее о переменных в сообщениях…

диагностика;

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

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

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

    1. Найдите в пакете прокси API код, в котором впервые была определена переменная.
    2. В большинстве случаев проблемная переменная создается и заполняется в другом правиле, которое выполняется до правила вызова сервиса. Например, политика Assign Message часто используется для создания и заполнения переменных в потоке прокси-сервера 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> в неудачном правиле 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. Подробнее о переменных в сообщениях…

диагностика;

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

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

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

    1. Найдите в пакете прокси API код, в котором впервые была определена переменная.
    2. В большинстве случаев проблемная переменная создается и заполняется в другом правиле, которое выполняется до правила вызова сервиса. Например, политика Assign Message часто используется для создания и заполнения переменных в потоке прокси-сервера API.
    3. Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
      • Проверьте значение атрибута type (если он есть).
      • Если атрибут type отсутствует, переменная считается строкой.
    4. Если тип переменной не 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 имеет неправильный формат или содержит недопустимое или недоступное имя хоста.

диагностика;

  1. Определите правило Service Callout, вызвавшее ошибку. Название правил указывается в элементе faultstring ответа об ошибке. Например, в приведенном ниже фрагменте кода faultstring название политики Service Callout, которая не сработала, – 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://, но нет действительного имени хоста. Поэтому правило 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.

диагностика;

  1. Определите правило Service Callout, вызвавшее ошибку. Название правил указывается в элементе faultstring ответа об ошибке. Например, в приведенном ниже фрагменте faultstring название политики Service Callout, которая не сработала, – 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, следуйте инструкциям в руководствах по устранению ошибок времени выполнения.