Перевод с WSO2 на верблюда с Java DSL: как пересылать с шаблоном URI - PullRequest
0 голосов
/ 18 февраля 2020

Я удаляю WSO2 из нашего стека, и я должен написать в Camel Java DSL конечные точки, которые были реализованы в WSO2.

В WSO2 у нас была конечная точка, как показано ниже:

<resource methods="OPTIONS GET" uri-template="/request/{data}" inSequence="requestreset"/>
<http method="GET" uri-template="http://127.0.0.1/index.php?_q=requestreset&amp;data={uri.var.data}"/>

Мой код в Java Маршрутизатор Camel:


public class DefaultRouteBuilder extends RouteBuilder {

    private HashMap<String, String> routeCorresponding = new HashMap();

    @Override
    public void configure() throws Exception {

        routeCorresponding.put("reset/request/{data}", "http://127.0.0.1/index.php?_q=requestreset&data={data}");

        for (Map.Entry<String, String> pair : routeCorresponding.entrySet()) {
            String url = pair.getKey();
            String target = pair.getValue();

            String resultTarget = target.contains("?") ? target + "&bridgeEndpoint=true" : target + "?bridgeEndpoint=true";

            fromF("servlet:"+ url +"?matchOnUriPrefix=true")
                    .log("Request: ${in.header."+ Exchange.HTTP_METHOD +"} to ${in.header."+ Exchange.HTTP_URI +"}")
                    .toF(resultTarget);
        }

    }

}

Но он не работает так, как я хотел бы, потому что когда я делаю запрос к tomcat.myserver.com:8080/camel-example-servlet/reset/request/blablablablabla, я получаю ответ: org.apache.camel.http.common.HttpOperationFailedException: HTTP operation failed invoking http://127.0.0.1/index.php/reset/request/blablablablabla?_q=requestreset&data=%7Bdata%7D with statusCode: 404

Вместо http://127.0.0.1/index.php/reset/request/blablablablabla?_q=requestreset&data=%7Bdata%7D я бы хотел, чтобы следующий запрос был на http://127.0.0.1/index.php?_q=requestreset&data=blablablablabla

Можно ли добиться в Camel / Java DSL этого? В основном, что WSO2 реализовывал с помощью шаблона URI и фигурных скобок вокруг полей?

1 Ответ

1 голос
/ 04 марта 2020

Вы можете достичь этого, но ваш блок {data} хранится в виде заголовка, поэтому вам нужно обозначить его как ${header.data} в целевом URI .

Вот пример использования REST DSL :

restConfiguration().component("servlet");

rest("/reset/request/{data}")
    .get()
    .route()
    .log("Received request...")
    .setHeader(Exchange.HTTP_PATH, simple("/index.php"))
    .setHeader(Exchange.HTTP_QUERY, simple("_q=requestreset&data=${header.data}"))
    .to("http://localhost:8080?bridgeEndpoint=true");

Редактирование на основе вашего вопроса ниже. В качестве альтернативы, если вам нужно прокси-серверы для сотен URL-адресов, вместо того, чтобы создавать сотни маршрутов, вы можете просто создать один единственный маршрут, который проксирует их все, и реализовать логи маршрутизации c в Процессоре , например:

from("servlet:?matchOnUriPrefix=true")
    .process(new Processor() {
        public void process(Exchange exchange) throws Exception { 
            // set your target URI here, look it up from the HashMap, etc.
        }
    })
    .to("http://localhost:8080?bridgeEndpoint=true");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...