WSO2 Synapse: настройка параметра URL
Я пытаюсь сделать что-то, что кажется простым, но не может заставить это работать. По сути, я хочу, чтобы менеджер API WSO2 добавил параметр 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"
(обратите внимание, что я удалил секретный параметр)
... и все равно получаю тот же результат.
Поэтому в основном я хочу, чтобы менеджер 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 = 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 ответа
Для тех, у кого может быть такая же проблема, вот другое решение, более простое и работающее.
Перейдите на портал администратора углерода, в список API, найдите соответствующий API и нажмите на него. Это приводит к XML-конфигурации API. После поля "адрес" (и на том же уровне в XML) добавьте поле:
<property name="Authorization" value="stuff to add" scope="transport"/>
Это добавляет свойство "Авторизация" со значением "материал".
Как я понял, вы пытаетесь добавить secret=pass
к вашей конечной точке URL. Когда вы вызываете API, я верю, что вы отправляете этот параметр. В то же время вы отправляете "blab=blib"
параметр также. Но в ESB вы должны изменить это на "toto=titi"
Метод, который вы использовали, является правильным. (То есть: Использование свойства REST_URL_POSTFIX
) В этом случае он заменит все параметры рекветов. Но перед этим вы можете сохранить параметр запроса и использовать "REST_URL_POSTFIX"
Вы можете получить последний REST URL, который вам нужен. (да, это последний вариант, который вы упомянули как "подлежащий испытанию"). В адресе "TO" адрес будет указан только после номера порта. Если вы используете "" POST_TO_URI"
Свойство yopu будет видеть полный адресный адрес, напечатанный в журнале, но мы используем его, если есть прокси-сервер, настроенный между сервисом BE и ESB.
Я решил свою проблему.
Вот что я делаю:
- в файле конфигурации получите постфикс URL с помощью REST_URL_POSTFIX и поместите его в свойство
- редактировать свойство в посреднике Java
- используйте REST_URL_POSTFIX, чтобы установить новый постфикс в 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. Надеюсь, что это помогает другим.