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 : все мои пути и параметры исчезли и были заменены настроенными. Эй, вот как это должно работать, не так ли?
Проблемы:
- это не добавляет что-то к URL, он устанавливает постфикс URL, означающий, что существующие параметры исчезают (в приведенном выше примере blab=blib)
- она должна начинаться с "/" чтобы быть допустимым значением, поэтому я не могу просто добавить &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&secret=foo
Деформирован? Есть более подробная информация в трассировке стека исключений:
java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo
Итак, то, что происходит, - это посредники (регистрируют или переписывают) получают сообщение, чье поле "To:" указывает на URL без протокола!
Конечно, я гуглил, и есть некоторые случаи, когда я нахожу, что у других людей есть logMediator: To: /blabla , и другие (большинство) случаев, когда у них есть logMediator: To: http ://blabla . Я действительно не понимаю, в чем причина такой разницы. :- (
Так вот где я застрял!! :-(
Вариант, который нужно попробовать
Я в курсе. что, вероятно, есть решение кувалды, которое должно работать:
- используйте свойство для хранения полного пути и всех параметров
- реализовать мой собственный медиатор (например, в Java), чтобы изменить эти параметры
- используйте свойство REST_URL_POSTFIX, чтобы поместить измененный постфикс в вызов
У меня есть своего рода надежда, что кто-то укажет мне на простой ресурс (медиатор, пример, синтаксическая ошибка, что угодно), которые я не нашел, и это делает именно то, что я хочу. Оптимизм... :- )
Спасибо за чтение. Есть идеи?
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
Я решена моя проблема.
Вот что я делаю:
- в конфигурационном файле получите постфикс URL с помощью REST_URL_POSTFIX и поместите его в собственность
- редактирование свойства в посреднике Java
- Используйте 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".