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