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


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

Установка и проблема

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

Я могу бежать

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"

(обратите внимание, что я удалил параметр secret)

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

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

Первое, что я попробовал: посредник по собственности

Используйте Synapse XML config ссвойством 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 посредника

I нашел этот медиатор, и хотя он, вероятно, не сделает трюк, это хорошая зацепка: я могу просто позвонить с помощью 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 3

3 ответа:

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

Метод, который вы использовали, правильный.(ie: Using property REST_URL_POSTFIX) в этом случае он заменит все параметры requets. Но перед этим вы можете сохранить параметр запроса и использовать "REST_URL_POSTFIX" вы можете достичь конечного url-адреса отдыха, который вам нужен. (да, это так последний вариант, который вы упомянули как " быть судимым") В адресе "кому" у вас будет только адрес после номера порта. Если вы используете свойство "" POST_TO_URI", yopu увидит полный адрес URL, напечатанный в журнале, но мы используем его, если есть какой-либо прокси-сервер, настроенный между be service и 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 и остальные...) чтобы все прояснить.

Для второго шага это конфигурационный 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. Надеюсь, это поможет другим.

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

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

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

Это добавляет свойство " Authorization "со значением"stuff".