Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
НеразрешеннаяПеременная
Код ошибки
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
Разрешение
Убедитесь, что переменная, на которую ссылается политика, существует и доступна в конкретном потоке, в котором выполняется политика назначения сообщения.
Чтобы исправить пример политики, показанный выше, вы можете изменить атрибут источника в элементе <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>
ПеременнаяОфНонмсгтипе
Код ошибки
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 .
Переменные типа сообщения представляют собой все HTTP-запросы и ответы. Встроенные переменные потока Edge request
, response
и message
имеют тип message. Дополнительные сведения о переменных сообщения см. в справочнике по переменным .
Диагностика
Определите политику назначения сообщений, в которой произошла ошибка, и имя переменной, тип которой неверен. Оба этих элемента можно найти в элементе
faultstring
ответа об ошибке. Например, в следующейfaultstring
имя политики —GenerateGeocodingRequest
, а переменная —PostalCode
:"faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
В XML-коде Assign Message Policy 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, где переменная была определена первой.
- После того, как вы определите политику, в которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
- Проверьте значение атрибута type (если он присутствует).
- Если атрибут type отсутствует, переменная считается строкой.
- Если тип переменной не является сообщением (например, строка), то это и есть причина ошибки. Вы можете узнать об распространенных переменных и их типах в справочнике по переменным .
Например, посмотрите на переменную PostalCode в приведенном выше XML. Ему присваивается значение переменной потока
request.queryparam.postalcode
в элементе<AssignVariable>
. Это значение является строкой, поскольку в назначении переменной нет атрибута типа.Теперь вспомните, что переменная PostalCode используется в элементе
<Copy>
политики Assign Message:<Copy source="PostalCode"> <QueryParams> <QueryParam name="PostalCode" /> </QueryParams> </Copy>
Поскольку PostalCode не имеет типа message (в данном примере это строка), вы получаете код ошибки:
steps.assignmessage.VariableOfNonMsgType
Разрешение
Убедитесь, что для атрибута source
в элементе <Copy>
в неудачной политике назначения сообщения задана существующая переменная потока типа сообщения .
Чтобы исправить политику, вы можете изменить атрибут source
в элементе <Copy>
, указав переменную типа message. Например, если политика назначения сообщения должна выполняться в потоке запросов, вы можете использовать request
переменной типа сообщения или любую другую пользовательскую переменную типа сообщения.
<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>