java Camel -如何添加请求参数(throwExceptionOnFailure)到url?

cx6n0qe3  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(167)

我有以下路线:

from("quartz2:findAll//myGroup/myTimerName?cron=" + pushProperties.getQuartz())
                //.setBody().constant("{ \"id\": \"FBJDBFJHSDBFJSBDfi\" }")
                .to("mongodb:mongoBean?database=" + mongoDataConfiguration.getDatabase()
                        + "&operation=findAll&collection=" + mongoDataConfiguration.getDataPointCollection())
                .process(exchange -> {
                    exchange.getIn().setBody(objectMapper.writeValueAsString(exchange.getIn().getBody()));
                }).streamCaching()
                .setHeader(Exchange.HTTP_METHOD, constant(pushProperties.getHttpMethod()))
                .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_JSON_VALUE))                    
                .to(pushProperties.getUrl() + "&throwExceptionOnFailure=false").streamCaching()

如您所见,我使用throwExceptionOnFailure=false
我从配置中获取了我的网址。但是我们发现如果
pushProperties.getUrl() = localhost:8080/url?action=myaction
并且在以下情况下不起作用
pushProperties.getUrl() = localhost:8080/url
在camel中是否有通用的方法来添加请求参数到URL?
比如:

private String buildUrl() {
    String url = pushProperties.getUrl();
    return url + (url.contains("?") ? "&" : "?") + "throwExceptionOnFailure=false";
}

Camel 皮内

zdwk9cvp

zdwk9cvp1#

这是因为在localhost:8080/url的情况下,在附加之后,它变成这样
localhost:8080/url&throwExceptionOnFailure=false
这是不对的
应该是
localhost:8080/url?throwExceptionOnFailure=false
在第一种情况下,您已经有一个requestpatam(?action=myaction),所以下一个请求可以用"&"符号添加

dsf9zpds

dsf9zpds2#

我认为您必须添加自己的逻辑,以便在运行时将端点组合到http组件中,这是因为CamelContext将在路由过程中处理它,参数throwExceptionOnFailurehttp组件中的一个属性。
我不认为通过.setHeader(Exchange.HTTP_QUERY, constant("throwExceptionOnFailure=false"))添加参数会起作用,因为这些参数将在http组件得到处理后进行评估,例如到URL目的地。请看一下"How to use a dynamic URI in to()"

.toD(pushProperties.getUrl() + "&throwExceptionOnFailure=false")

您可以使用simple expression编写一个逻辑,根据pushProperties.getUrl()的结果执行您想要的操作。

jtw3ybtb

jtw3ybtb3#

我不喜欢Camel在这种情况下配置HTTP组件的方式,但这就是它。
我的建议是创建一个configMap,并将您的args附加到它,然后用“&"进行手动连接,然后将其附加到主URL。
我这样做:

public class MyProcessor {
    /**
     * Part of Camel HTTP component config are done with URL query parameters.
     */
    private static final Map<String, String> COMMON_QUERY_PARAMS = Map.of(
            // do not throw HttpOperationFailedException; we handle them ourselves
            "throwExceptionOnFailure", "false"
    );

    @Handler
    void configure(Exchange exchange, ...) {
        ...
        Map<String, String> queryParams = new HashMap<>();
        queryParams.put("foo", "bar");
        message.setHeader(Exchange.HTTP_QUERY, mergeAndJoin(queryParams));
        ...
    }
    
    private String mergeAndJoin(Map<String, String> queryParams) {
        // make sure HTTP config params put after event params
        return Stream.concat(queryParams.entrySet().stream(), COMMON_QUERY_PARAMS.entrySet().stream())
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .collect(Collectors.joining("&"));
    }

}

注意,toD需要优化,但在这种情况下,不能使用HTTP_QUERY。
优化组件正在使用时,不能使用Exchange.HTTP_PATH和Exchange.HTTP_QUERY标头来提供动态值以覆盖toD中的URI。如果要使用这些标头,请改用纯DSL。换句话说,toD在内部使用这些标头来承载端点的动态详细资料。
https://camel.apache.org/components/3.20.x/eips/toD-eip.html

相关问题