Устранение ошибок во время выполнения Service Callout,Устранение неполадок во время выполнения Service Callout

Вы просматриваете документацию 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. Определите политику вызова службы, в которой произошла ошибка, и имя переменной, тип которой неверен. Оба этих элемента можно найти в элементе 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, где переменная была определена первой.
    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 не имеет типа 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. Дополнительные сведения о переменных сообщения см. в справочнике по переменным .

Диагностика

  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, где переменная была определена первой.
    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) .