WSO2 Synapse: настройка параметра URL

Я пытаюсь сделать что-то, что кажется простым, но не может заставить это работать. По сути, я хочу, чтобы менеджер API WSO2 добавил параметр URL в вызов REST.

Настройка и проблема

У меня установлен менеджер WSO2 API. У меня также есть Tomcat, работающий с поддельным сервлетом под названием someservlet, который просто регистрирует все, что получает, и возвращает нормально. Я добавил сервлет в качестве API в менеджере, чтобы я мог вызывать сервлет напрямую или через WSO2 API mgr.

я могу бежать

curl http://localhost:8080/someservlet/servlet/toto?blob=blib&secret=pass

и сервлет работает нормально, он говорит мне, что получил путь /toto и параметры blob и secret.

я могу бежать

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib&secret=pass"

И это точно так же. Все идет нормально.

Я хочу запустить:

curl -H "Authorization: Bearer MqVQuHqLNphtPV3XF1CtXVmbyP8a" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib"

(обратите внимание, что я удалил секретный параметр)

... и все равно получаю тот же результат.

Поэтому в основном я хочу, чтобы менеджер API добавил параметр URL secret = pass.

Первое, что я попробовал: имущественный посредник

Используйте XML-конфигурацию Synapse со свойством REST_URL_POSTFIX.

Я отредактировал конфигурационный файл API и добавил

<property name="REST_URL_POSTFIX" value="/blob?toto=titi" scope="axis2" type="STRING"/>

Теперь, если я бегу

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toti?blab=blib&secret=puss"

это как если бы я запустил someservlet / 1.0 / blob? toto = titi: все мои пути и параметры исчезли и были переназначены с настроенными. Эй, вот как это должно работать, не так ли?

Проблемы:

  1. это не добавляет что-то к URL, оно устанавливает постфикс URL, что означает, что существующие параметры исчезают (в приведенном выше примере, blab = blib)
  2. оно должно начинаться с "/", чтобы быть допустимым значением, поэтому я не могу просто добавить &secret=pass (конечно, из-за проблемы 1 это было бы бесполезно в любом случае)

Так что, в принципе, это не позволяет мне добавить последний проход &secret=pass.

Второе, что я попробовал: переписать URL-посредник

Я нашел этого посредника, и, хотя он, вероятно, не сработает, это хорошее руководство: я могу просто позвонить с secret = foo и заставить посредника заменить его secret = pass.

Я положил это в файле конфигурации:

<rewrite>
  <rewriterule>
    <action type="replace" value="pass" fragment="query" regex="foo"/>
  </rewriterule>
</rewrite>

Это не работает Сначала я думал, что у меня не правильно заданы параметры действия. Но сообщение об ошибке:

Malformed URL when processing /someservlet/1.0/toti?blab=blib&amp;secret=foo

Искаженный? В трассировке стека исключений есть больше деталей:

java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo

Таким образом, происходит то, что посредники (регистрируют или переписывают) получают сообщение, чье поле "To:" указывает на URL без протокола!

Конечно, я гуглял, и в некоторых случаях я нахожу, что другие люди имеют logMediator: To: / blabla, и другие (большинство) случаи, когда у них есть logMediator: To: http: // blabla. Я действительно не вижу, что вызывает разницу.:-(

Так вот где я застрял!! :-(

Возможность попробовать

Я знаю, что есть решение кувалды, которое должно работать:

  1. использовать свойство для хранения полного пути и всех параметров
  2. реализовать свой собственный посредник (например, в Java), чтобы изменить эти параметры
  3. используйте свойство REST_URL_POSTFIX, чтобы поместить модифицированный постфикс в вызов

Однако я считаю, что эта проблема должна иметь более простое решение.

У меня есть какая-то надежда, что кто-то укажет мне на простой ресурс (посредник, пример, синтаксическая ошибка, что угодно), который я не нашел и который делает то, что я хочу. Оптимизм...:-)

Спасибо за прочтение. Есть идеи?

3 ответа

Решение

Для тех, у кого может быть такая же проблема, вот другое решение, более простое и работающее.

Перейдите на портал администратора углерода, в список API, найдите соответствующий API и нажмите на него. Это приводит к XML-конфигурации API. После поля "адрес" (и на том же уровне в XML) добавьте поле:

<property name="Authorization" value="stuff to add" scope="transport"/>

Это добавляет свойство "Авторизация" со значением "материал".

Как я понял, вы пытаетесь добавить secret=pass к вашей конечной точке URL. Когда вы вызываете API, я верю, что вы отправляете этот параметр. В то же время вы отправляете "blab=blib" параметр также. Но в ESB вы должны изменить это на "toto=titi"

Метод, который вы использовали, является правильным. (То есть: Использование свойства REST_URL_POSTFIX) В этом случае он заменит все параметры рекветов. Но перед этим вы можете сохранить параметр запроса и использовать "REST_URL_POSTFIX"Вы можете получить последний REST URL, который вам нужен. (да, это последний вариант, который вы упомянули как "подлежащий испытанию"). В адресе "TO" адрес будет указан только после номера порта. Если вы используете "" POST_TO_URI" Свойство yopu будет видеть полный адресный адрес, напечатанный в журнале, но мы используем его, если есть прокси-сервер, настроенный между сервисом BE и ESB.

Я решил свою проблему.

Вот что я делаю:

  1. в файле конфигурации получите постфикс URL с помощью REST_URL_POSTFIX и поместите его в свойство
  2. редактировать свойство в посреднике Java
  3. используйте REST_URL_POSTFIX, чтобы установить новый постфикс в XML

Для первого шага я использую эту строку:

<property name="querystrings" expression="get-property('axis2', 'REST_URL_POSTFIX')"/>

это заняло некоторое время, потому что есть много строк, которые мне не подходят, потребовалось 2 параметра (axis2 и REST...), чтобы получить это прямо.

Для второго шага это конфиг XML:

<class name="mypackage.AddUrlParamMediator">
    <property name="paramName" value="mykey"/>
    <property name="paramValue" value="mysecret"/>
</class>

это класс-посредник (без импорта):

public class AddUrlParamMediator extends AbstractMediator {
    private String paramName = "default";
    private String paramValue = "default";

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public void setParamValue(String paramValue) {
        this.paramValue = paramValue;
    }

    public boolean mediate(MessageContext synapseMsgContext) {
        SynapseLog log = this.getLog(synapseMsgContext);
        String urlNewParam = this.paramName + "=" + this.paramValue;
        Object queryStringsPpty = synapseMsgContext.getProperty("querystrings");
        if (queryStringsPpty == null) {
            log.error("### queryStringPpty=null, exiting!");
            return true;
        }
        String queryStrings = queryStringsPpty.toString();
        queryStrings = (queryStrings.contains("?"))
            ? queryStrings + "&" + urlNewParam
            : queryStrings + "?" + urlNewParam;
        synapseMsgContext.setProperty("querystrings", queryStrings);
        return true;
    }
}

и, конечно, вот третий шаг в конфигурации XML:

<property name="REST_URL_POSTFIX" expression="get-property('querystrings')" scope="axis2" type="STRING"/>

Так что все это в основном устанавливает параметр в конце URL. Надеюсь, что это помогает другим.

Другие вопросы по тегам