Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Неразрешенная переменная
Код ошибки
steps.assignmessage.UnresolvedVariable
Тело ответа об ошибке
{ "fault": { "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]", "detail": { "errorcode": "steps.assignmessage.UnresolvedVariable" } } }
Причина
Эта ошибка возникает, если переменная, указанная в политике «Присвоить сообщение», имеет одно из следующих значений:
- выходит за рамки действия (недоступно в конкретном процессе, в котором выполняется политика) или
- Не может быть решено (не определено)
Например, эта ошибка возникает, если политика «Назначить сообщение» выполняется в потоке запроса, но атрибут source в элементе <Copy> установлен на переменную response или error , или любую другую пользовательскую переменную, которая не существует в потоке запроса.
Диагноз
Укажите политику назначения сообщений, в которой произошла ошибка, и имя недоступной переменной. Оба эти элемента можно найти в элементе
faultstringответа об ошибке.Например, в следующей
faultstringимя политики —googleBook, а переменная —var:"faultstring": "AssignMessage[googleBook]: unable to resolve variable var"В XML-файле политики назначения сообщений, в котором произошла ошибка, убедитесь, что имя используемой переменной совпадает с именем переменной, указанным в строке ошибки (шаг № 1 выше). Например, следующая политика устанавливает атрибут источника в элементе
<Copy>на переменную с именемvar, которая соответствует имени вfaultstring:<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1"> <DisplayName>googleBook</DisplayName> <Properties /> <Copy source="var"> <Headers> <Header name="user-agent" /> </Headers> </Copy> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo> </AssignMessage>Определите, определена ли переменная и доступна ли она в потоке, в котором выполняется политика назначения сообщений.
Если переменная имеет одно из следующих значений:
- выходит за рамки действия (недоступно в конкретном процессе, в котором выполняется политика) или
- Не может быть решено (не определено)
Тогда в этом и заключается причина ошибки.
В качестве примера предположим, что политика «Назначить сообщение», показанная выше, выполняется в потоке запроса. Проверьте, определена ли переменная
varв какой-либо из политик, которые выполняются до политики «Назначить сообщение» в потоке запроса. Если переменная не определена, вы получите код ошибки:steps.assignmessage.UnresolvedVariable
Разрешение
Убедитесь, что переменная, на которую ссылается политика, существует и доступна в конкретном потоке, где выполняется политика назначения сообщений.
Чтобы исправить приведенный выше пример политики, вы можете изменить атрибут source в элементе <Copy> на переменную запроса или любую другую пользовательскую переменную типа message, существующую в потоке запроса.
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
<DisplayName>googleBook</DisplayName>
<Properties />
<Copy source="request">
<Headers>
<Header name="user-agent" />
</Headers>
</Copy>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>
VariableOfNonMsgType
Код ошибки
steps.assignmessage.VariableOfNonMsgType
Тело ответа об ошибке
{ "fault": { "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message", "detail": { "errorcode": "steps.assignmessage.VariableOfNonMsgType" } } }
Причина
Эта ошибка возникает, если атрибуту source в элементе <Copy> присвоено значение переменной, не являющейся типом message .
Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge — request , response и message имеют тип message. Для получения дополнительной информации о переменных типа Message см. справочник по переменным .
Диагноз
Укажите политику назначения сообщений, в которой произошла ошибка, и имя переменной, тип которой указан неверно. Оба эти элемента можно найти в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики —GenerateGeocodingRequest, а переменная —PostalCode:"faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"В XML-файле политики назначения сообщений, в котором произошла ошибка, убедитесь, что имя переменной, установленной в элементе
<Copy>совпадает с именем переменной, указанным в строке ошибки (шаг #1 выше). Например, следующая политика устанавливает атрибут источника для переменной с именемPostalCode, которая соответствует содержимому строкиfaultstring:<AssignMessage name="GenerateGeocodingRequest"> <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo> <AssignVariable> <Name>PostalCode</Name> <Ref>request.queryparam.postalcode</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> <Copy source="PostalCode"> <QueryParams> <QueryParam name="q" /> </QueryParams> </Copy> </AssignMessage>Определите, является ли эта переменная сообщением или нет:
- Найдите код в пакете API Proxy, где эта переменная была определена впервые.
- После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута типа (если он присутствует).
- Если атрибут типа отсутствует, то переменная считается строкой.
- Если тип переменной не является сообщением (например, строкой), то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .
Например, взгляните на переменную PostalCode в приведенном выше XML-коде. Ей присваивается значение переменной потока
request.queryparam.postalcodeв элементе<AssignVariable>. Это значение является строкой, поскольку в присваивании переменной отсутствует атрибут type.Напомним, что переменная PostalCode используется в элементе
<Copy>политики Assign Message:<Copy source="PostalCode"> <QueryParams> <QueryParam name="PostalCode" /> </QueryParams> </Copy>Поскольку PostalCode не имеет типа сообщения (в этом примере это строка), вы получаете код ошибки:
steps.assignmessage.VariableOfNonMsgType
Разрешение
Убедитесь, что атрибут source в элементе <Copy> в неудачно выполненной политике Assign Message установлен на существующую переменную потока типа сообщения .
Для корректировки политики можно изменить атрибут source в элементе <Copy> , указав переменную типа message. Например, если политика Assign Message должна выполняться в потоке запроса, можно использовать переменную типа message типа request или любую другую пользовательскую переменную типа message.
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
<Copy source="request">
<QueryParams>
<QueryParam name="PostalCode" />
</QueryParams>
</Copy>
</AssignMessage>