WSO2 EI: Могу ли я использовать посредника для запроса другого API и передачи его ответа на запрос тела?

#dynamic #wso2 #token #wso2ei #mediator

Вопрос:

В моем случае я хочу добавить динамическое значение («Носитель» {токен доступа}) к посреднику заголовка . Поэтому перед посредником заголовка я хочу вызвать API get-token и извлечь элемент {access-token} из его ответа. Как я могу это получить ? Огромное спасибо.

Ответ №1:

Вы можете выполнить такие требования с помощью последовательностей посредничества. Вы можете обратиться к этому блогу для получения более подробных инструкций о том, как разработать последовательность для ваших требований. Блог написан для продукта API Manager, но, тем не менее, вы можете сделать то же самое, чтобы сделать это в EI.

Пример последовательности посредничества будет выглядеть следующим образом

 <?xml version="1.0" encoding="UTF-8"?>
<sequence name="oauth2-sequence" xmlns="http://ws.apache.org/ns/synapse">
    <!-- token generation to the oauth server's token endpoint -->
    <!-- add the base64 encoded credentials -->
    <property name="client-authorization-header" scope="default" type="STRING" value="MDZsZ3BTMnh0enRhOXBsaXZGUzliMnk4aEZFYTpmdE4yWTdLcnE2SWRsenBmZ1RuTVU1bkxjUFFh" />
    <property name="request-body" expression="json-eval($)" scope="default" type="STRING" />
    <property name="resource" expression="get-property('axis2', 'REST_URL_POSTFIX')" scope="default" type="STRING" />

    <!-- creating a request payload for client_credentials -->
    <payloadFactory media-type="xml">
        <format>
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                <soapenv:Body>
                    <root xmlns="">
                        <grant_type>client_credentials</grant_type>
                    </root>
                </soapenv:Body>
            </soapenv:Envelope>
        </format>
        <args></args>
    </payloadFactory>

    <!-- set related headers to call the token endpoint -->
    <header name="Authorization" expression="fn:concat('Basic ', get-property('client-authorization-header'))" scope="transport" />
    <header name="Content-Type" value="application/x-www-form-urlencoded" scope="transport" />
    <property name="messageType" value="application/x-www-form-urlencoded" scope="axis2" type="STRING" />
    <property name="REST_URL_POSTFIX" value="" scope="axis2" type="STRING" />

    <!-- change the token endpoint -->
    <call blocking="true">
        <endpoint>
            <http method="POST" uri-template="https://localhost:9443/oauth2/token" />
        </endpoint>
    </call>

    <!-- append the acquired access token and make the call to the backend service -->
    <property name="bearer-token" expression="json-eval($.access_token)" scope="default" type="STRING" />
    <property name="REST_URL_POSTFIX" expression="get-property('resource')" scope="axis2" type="STRING" />
    <header name="Authorization" expression="fn:concat('Bearer ', get-property('bearer-token'))" scope="transport" />
    <payloadFactory media-type="json">
        <format>$1</format>
        <args>
            <arg evaluator="xml" expression="get-property('request-body')" />
        </args>
    </payloadFactory>

    <!-- perform a send or call to complete the execution of the backend service call in EI -->
</sequence>
 

Надеюсь, это поможет вам начать с внедрения.

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

1. Ткс так много. Можете ли вы объяснить часть «REST_URL_POSTFIX»? Мне это не совсем ясно

2. REST_URL_POSTFIX Содержит оставшийся URL-адрес ресурса API (например: /api/v1/operation -> > operation будет сохранен как REST_URL_POSTFIX ). Если вы вызываете API /api/v1/operation и в последовательности , если вы пытаетесь вызвать конечную точку как https://some-host/token , URL-адрес будет выглядеть следующим образом: https://some-host/token/operation . Поэтому мы должны удалить это и снова добавить его при вызове реальной службы. Вы можете узнать об этом объекте недвижимости в [здесь ]( docs.wso2.com/display/ESB470/HTTP Транспорт Недвижимость )

3. Можете ли вы объяснить, для чего в конечном итоге используется посредник <payloadFactory>? Я так благодарна вам за помощь!

4. В середине последовательности мы используем a PayloadFactory для создания полезной нагрузки для генерации токена. Таким образом, если вы вызываете запрос POST (который является фактическим вызовом REST), то отправленной вами полезной нагрузки запроса не будет в EI, так как мы изменили полезную нагрузку с помощью PayloadFactory . Поэтому в конце мы добавляем еще PayloadFactory один, чтобы снова создать фактическую полезную нагрузку, чтобы отправить ее на серверную часть.

5. Вы можете захватить полезную нагрузку запроса с помощью $body (без использования json-eval($) ) и обновить PayloadFactory данные посредника media-type как xml