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

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

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

У меня установлен менеджер API WSO2. У меня также есть 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"

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

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

Итак, в основном я хочу, чтобы менеджер 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= пройти.

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

<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

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

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

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

Вариант, который нужно попробовать

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

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

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

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

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


person JRobinss    schedule 25.01.2013    source источник


Ответы (3)


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

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

person Ratha    schedule 28.01.2013
comment
IIUC, вы говорите мне делать то, что я написал под опционом на судебное разбирательство, я попробую. Что касается поля to:, я не жалуюсь на то, что вижу в логах, это посредник перезаписи жалуется, что не получает протокол. Как вы предоставляете действительный URL-адрес, включая протокол, посреднику перезаписи? - person JRobinss; 29.01.2013
comment
вы говорите мне делать то, что я написал под заголовком «быть испытанным», да .. Эта конфигурация посредника перезаписи выглядит правильно. Я проверил, кажется, работает. Какую версию APIM вы используете? в настоящее время мы работаем над поддержкой REST__>REST, где мы можем динамически создавать конечные точки с использованием удобных шаблонов URI. - person Ratha; 29.01.2013
comment
По поводу посредника по перезаписи: Я думаю, что дело не в конкретном посреднике, а в любом посреднике. Это означает, что сообщение, которое приходит туда, имеет неполное поле «Кому:». Просто, я думаю, большинству посредников все равно. Я использую версию 1.2.0. - person JRobinss; 29.01.2013

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

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

  1. in the config file, get the URL postfix using REST_URL_POSTFIX and put it in a property
  2. edit the property in a Java mediator
  3. use REST_URL_POSTFIX to set the new postfix in 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-адреса. Надеюсь, это поможет другим.

person JRobinss    schedule 08.02.2013

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

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

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

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

person JRobinss    schedule 11.09.2014