Опитвам се да направя нещо, което изглежда лесно, но не мога да го накарам да работи. По принцип искам WSO2 API мениджърът да добави 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"
(имайте предвид, че премахнах параметъра 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: До: /blabla и други (повечето) случаи, в които имат logMediator: До: http ://blabla. Наистина не виждам на какво се дължи разликата. :-(
Значи тук съм заседнал!! :-(
Вариант да се пробва
Наясно съм, че вероятно има решение с чук, което трябва да работи:
- използвайте свойство за съхраняване на пълния път и всички параметри
- внедрявам собствен посредник (напр. в Java), за да променя тези параметри
- използвайте свойство REST_URL_POSTFIX, за да поставите модифицирания постфикс на повикването
Въпреки това смятам, че този проблем трябва да има по-просто решение.
Имам известна надежда, че някой ще ме насочи към прост ресурс (медиатор, пример, синтактична грешка, каквото и да е), който не съм намерил и който прави точно това, което искам. Оптимизъм... :-)
Благодаря за четенето. Някакви идеи?