Передача ответов от одного посредника вызова к другому в WSO2 ESB

#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. Здесь мы используем посредник скрипта для хранения токена в реестре. (Логика фильтра необходима, чтобы пропустить вызов конечной точки токена, если у нас есть действительный токен в реестре, также мы должны обновить токен, если срок его действия истек) Надеюсь, этот пример посредничества поможет,

https://github.com/wso2-extensions/esb-connector-gmail/blob/master/src/main/resources/config/getAccessTokenFromRefreshToken.xml

Комментарии:

1. Спасибо за ответ. Но если ответа от конечной точки нет в URI, как вы получаете доступ к значению? в моем случае это внутри полезной нагрузки, которую я получаю от первого вызова. Токен доступа будет удален после всего потока?

2. Если токен находится в полезной нагрузке ответа, его можно извлечь, используя свойство с выражением XPath. Например: <имя свойства=»uri.var.gmail.accessToken» выражение=»json-eval($.access_token)»/>