#wso2 #wso2esb #wso2-am
# #wso2 #wso2-api-manager #wso2-esb
Вопрос:
Я создал REST API с помощью инструмента Integrator. Я могу выполнять последовательные вызовы, но я не знаю, как сохранить и использовать ответ от первого вызова в качестве заголовка для вызова следующей конечной точки.
Сценарий таков: я должен сначала обратиться к конечной точке, чтобы получить один токен, а в ответе я хочу установить заголовок с токеном-носителем для получения файла JSON, вызывающего следующую конечную точку.
Мой код:
<?xml version="1.0" encoding="UTF-8"?>
<api context="/example" name="example" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST GET">
<inSequence>
<log description="request log" level="full"/>
<payloadFactory description="body" media-type="json">
<format>
{
"grant_type": "authorization_code"
}
</format>
<args/>
</payloadFactory>
<call>
<endpoint>
<http method="post" statistics="enable" trace="enable" uri-template="http://localhost:5000/token">
<suspendOnFailure>
<initialDuration>-1</initialDuration>
<progressionFactor>1</progressionFactor>
</suspendOnFailure>
<markForSuspension>
<retriesBeforeSuspension>0</retriesBeforeSuspension>
</markForSuspension>
</http>
<property name="grant_type" scope="transport" value="authorization_code"/>
</endpoint>
</call>
<filter regex="200" source="get-property('axis2', 'HTTP_SC')">
<then>
<log level="custom">
<property name="switchlog" value="Case: first call successful"/>
</log>
<call>
<endpoint>
<http method="get" uri-template="http://localhost:5000/json">
<suspendOnFailure>
<initialDuration>-1</initialDuration>
<progressionFactor>1</progressionFactor>
</suspendOnFailure>
<markForSuspension>
<retriesBeforeSuspension>0</retriesBeforeSuspension>
</markForSuspension>
</http>
</endpoint>
</call>
<respond description="final"/>
</then>
<else>
<log level="custom">
<property name="switchlog" value="Case: first call unsuccessful"/>
</log>
<respond/>
</else>
</filter>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>
Как я могу это сделать?
Ответ №1:
Вы можете сохранить токен в реестре после первого вызова. Это позволит остальной части запроса вызывать обратную передачу с использованием токена. Пожалуйста, обратитесь к реализации соединителя Gmail. Здесь мы используем посредник скрипта для хранения токена в реестре. (Логика фильтра необходима, чтобы пропустить вызов конечной точки токена, если у нас есть действительный токен в реестре, также мы должны обновить токен, если срок его действия истек) Надеюсь, этот пример посредничества поможет,
Комментарии:
1. Спасибо за ответ. Но если ответа от конечной точки нет в URI, как вы получаете доступ к значению? в моем случае это внутри полезной нагрузки, которую я получаю от первого вызова. Токен доступа будет удален после всего потока?
2. Если токен находится в полезной нагрузке ответа, его можно извлечь, используя свойство с выражением XPath. Например: <имя свойства=»uri.var.gmail.accessToken» выражение=»json-eval($.access_token)»/>