WSO2 Synapse: настройка на URL параметър

Опитвам се да направя нещо, което изглежда лесно, но не мога да го накарам да работи. По принцип искам 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: целият ми път и параметри са изчезнали и са заменени с конфигурираните. Хей, така трябва да работи, нали!

проблеми:

  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: До: /blabla и други (повечето) случаи, в които имат logMediator: До: 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" можете да постигнете крайния REST url, от който се нуждаете. (да, това е последната опция, която споменахте като „за изпробване“) В адреса „ДО“ ще имате адрес само след номера на порта. Ако използвате свойството "" 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, където можем динамично да конструираме крайната точка с помощта на Handy URI Templates. - person Ratha; 29.01.2013
comment
спрямо посредника за пренаписване: мисля, че не е този посредник в частност, а който и да е посредник. Това означава, че съобщението, което пристига там, има непълно поле To:. Просто мисля, че на повечето медиатори не им пука. Използвам версия 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"/>

Това добавя свойството "Authorization" със стойност "stuff".

person JRobinss    schedule 11.09.2014