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

Вы просматриваете документацию 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&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
        Req>uest variable=&qu<ot;Postal>Code&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/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&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quo>t; type=&<quot;reques>t"Geocod<ingRequest/AssignTo
    S>et
        QueryParams
        <    QueryPa>ram name=&quo<t;address"{request.>queryparam.postalcode}/Query<Param
     >       QueryP<aram name="region&q>uot;{<request.que>ryparam.c<ountry}/Quer>yParam
  <    >   <   Qu>eryPa<ram >name=<"sensor&q>uot;false</Que>ryParam
  <     > /QueryPa<ram>s
        VerbGET/Verb
    /S<et
 >   As<signVariable
  >     < NamePostalCod>e/Name
  <    >  Refre<quest>.querypar<am.>postalcode/Ref
    /Assign<Vari>able
<    AssignVaria>b<le
        Nam>eCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

Напомним, что переменная PostalCode используется в элементе <Request> политики вызова сервисной службы:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
    Req>uest variable=&qu<ot;Postal>Code&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
     <   Reque>st variable="<;var_resp>onse&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/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&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quot; type="request"GeocodingRe>quest/Assign<To
    As>signT<o c>reateNew=<"true&>quot; type=&q<uot;response"var_res>ponse/AssignTo
    Set
        <QueryParams>
            <QueryParam name="ad>dress"{request.querypar<am.postalco>de}/QueryPara<m
            QueryParam> name<="regi>on"{<request.quer>yparam.co<untr>y}/<Query>Param<
   >     <    QueryParam> name=&qu<ot;s>ensor"<;fals>e/QueryPa<ram>
        /QueryParams
       < Ver>bGET/<Verb
    /Set
 >   As<signVariable
 >       Na<mePo>stalCod<e/Nam>e
       < Re>frequest.queryparam.postal<code>/Ref
<    /AssignVari>a<ble
    Assign>Variable
        NameCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

Напомним, что переменная var_response используется в элементе <Request> политики вызова сервиса.

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
 <   Reque>st variable="<;var_resp>onse&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

Поскольку var_response не имеет типа "сообщение запроса" (ее тип - "сообщение ответа"), вы получаете код ошибки: steps.servicecallout.RequestVariableNotRequestMessageType .

Разрешение

Убедитесь, что переменная, заданная в элементе <Request> в политике обработки неудачных вызовов сервиса, является существующей переменной типа сообщения запроса , или же вы можете создать новую переменную типа сообщения запроса непосредственно в политике обработки вызовов сервиса (как описано в документации по политике ) и использовать ее.

Для исправления политики необходимо изменить элемент <Request> , указав существующую или новую переменную типа "сообщение запроса", и это будет работать в политике вызова службы. Например:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest"
    >    R<equest v>ariable="Geo<codingReq>uest&<quot;/
        ResponseG>eocodingR<esp>onse/Re<spon>se
      <  HTTPTargetConnectio>n<
            URLhtt>p:///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&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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) .