Java Camel:如何检查响应http响应

Java Camel:如何检查响应http响应,java,apache-camel,Java,Apache Camel,我对骆驼很陌生。我一直在尝试向Web服务提交数据(来自文件的Json)。这是我的代码: public static void main(String args[]) throws Exception { // create CamelContext CamelContext context = new DefaultCamelContext(); // add our route to the CamelContext c

我对骆驼很陌生。我一直在尝试向Web服务提交数据(来自文件的Json)。这是我的代码:

    public static void main(String args[]) throws Exception {
        // create CamelContext
        CamelContext context = new DefaultCamelContext();

        // add our route to the CamelContext
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {
                from("file:data/inbox?noop=true")
                    .marshal()
                    .string()
                    .setHeader(Exchange.CONTENT_TYPE,constant("application/json"))
                    .to("http://www.a-service.com");
            }
        });

        // start the route and let it do its work
        context.start();
        Thread.sleep(10000);

        // stop the CamelContext
        context.stop();
    }
然后Web服务将使用Json进行响应,Json可以 {结果:OK} 或 {结果:失败}

现在,如果响应的响应系数为200,那么CAMEL将被认为是成功的。 我的问题是,我怎样才能有一个响应的JSON验证过程,如果失败了,骆驼就不应该被认为是成功的? 解决方案Credit@Namphibian:

通过添加处理器和终端。此代码已经过测试:

    from("file:data/inbox?noop=true")
        .marshal()
        .string("UTF-8")
        .setHeader(Exchange.CONTENT_TYPE,constant("application/json"))
    .to("http://monrif-test.userspike.com/monrif/rss/monrif_-all-global")
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                Message in = exchange.getIn();
                String msg = in.getBody(String.class);
                System.out.println("Response: " + msg);
                if(msg.contains("OK")){
                    // go to party
                }else{
                    throw new Exception("test exception");
                }
            }
        });

您可以使用两种广泛的策略来实现这一目标

基于处理器:

将处理器添加到路由的末尾。在这个处理器中,检查Web服务是否会响应true或false值

处理器的外观如下所示:

    package com.example;

    import java.util.Map;

    import org.apache.camel.Body;
    import org.apache.camel.Exchange;
    import org.apache.camel.Handler;
    import org.apache.camel.Headers;
    import org.apache.camel.Message;

    public class GeneralProcessor {
        @Handler

        public void PrepapreErrorImportReport
        (

                @Headers Map hdr
                , Exchange exch
        )
        {

            //todo: Get the message as a string;

            Message in = exch.getIn();
            String msg = (String)in.getBody();
            // Now check if body contains failed or ok.
            if(msg.contains("OK")){
                //todo: go party the message was OK
            }
            else{
               //todo: Oh Oh! Houston we have a problem
            }


        }

    }
然后,您可以修改路由以使用此处理器

简单的表达语言

这是一种方法,另一种方法是使用简单的表达式语言。有关如何使用此功能,请参见下面的示例

 from("file:data/inbox?noop=true")
                .marshal()
                .string()
                .setHeader(Exchange.CONTENT_TYPE,constant("application/json"))
                .to("http://www.a-service.com")
                .choice()
                .when(simple("${body} contains 'OK'")).to("activemq:okqueue")
                .otherwise().to("activemq:queue:other");
请注意
简单(${body}包含'OK')
代码段。这就是简单的力量


这两种方法都有用途

您可以使用两种广泛的策略来实现这一目标

基于处理器:

将处理器添加到路由的末尾。在这个处理器中,检查Web服务是否会响应true或false值

处理器的外观如下所示:

    package com.example;

    import java.util.Map;

    import org.apache.camel.Body;
    import org.apache.camel.Exchange;
    import org.apache.camel.Handler;
    import org.apache.camel.Headers;
    import org.apache.camel.Message;

    public class GeneralProcessor {
        @Handler

        public void PrepapreErrorImportReport
        (

                @Headers Map hdr
                , Exchange exch
        )
        {

            //todo: Get the message as a string;

            Message in = exch.getIn();
            String msg = (String)in.getBody();
            // Now check if body contains failed or ok.
            if(msg.contains("OK")){
                //todo: go party the message was OK
            }
            else{
               //todo: Oh Oh! Houston we have a problem
            }


        }

    }
然后,您可以修改路由以使用此处理器

简单的表达语言

这是一种方法,另一种方法是使用简单的表达式语言。有关如何使用此功能,请参见下面的示例

 from("file:data/inbox?noop=true")
                .marshal()
                .string()
                .setHeader(Exchange.CONTENT_TYPE,constant("application/json"))
                .to("http://www.a-service.com")
                .choice()
                .when(simple("${body} contains 'OK'")).to("activemq:okqueue")
                .otherwise().to("activemq:queue:other");
请注意
简单(${body}包含'OK')
代码段。这就是简单的力量


这两种方法都有用途

过程
方法中,您可以使用下面的方法,它将起作用

LOGGER.info("Response code " + message.getHeader(exchange.HTTP_RESPONSE_CODE, Integer.class));

过程
方法中,您可以使用下面的方法,它将起作用

LOGGER.info("Response code " + message.getHeader(exchange.HTTP_RESPONSE_CODE, Integer.class));

非常感谢你的长篇大论。我有个问题。在“//todo:哦,哦!休斯顿,我们有一个问题”,我应该抛出一个异常还是有更好的方法?这取决于您的要求。您想抛出异常还是只向调用方报告失败。这取决于你想要什么。现在,我只想让它失败。所以,我想抛出异常就足够了。再次感谢。我想修改一下你的答案,以便新手能更容易地使用。@SurasinTancharoen查看此链接。这是一个需要理解的基本概念。web服务中的消息是文件。响应是out消息,它将成为选项的in消息。基本上,只要你写一条输出消息,它就会破坏输入消息。阅读链接,它将解释它。非常感谢你的长答案。我有个问题。在“//todo:哦,哦!休斯顿,我们有一个问题”,我应该抛出一个异常还是有更好的方法?这取决于您的要求。您想抛出异常还是只向调用方报告失败。这取决于你想要什么。现在,我只想让它失败。所以,我想抛出异常就足够了。再次感谢。我想修改一下你的答案,以便新手能更容易地使用。@SurasinTancharoen查看此链接。这是一个需要理解的基本概念。web服务中的消息是文件。响应是out消息,它将成为选项的in消息。基本上,只要你写一条输出消息,它就会破坏输入消息。阅读链接,它会解释它。这是检查HTTP状态代码的正确方法。然而,问题提到HTTP调用的结果将是一个JSON字符串,如{result:OK}或{result:FAIL},它与HTTP状态代码完全无关。这是检查HTTP状态代码的正确方法。然而,问题提到HTTP调用的结果将是类似{result:OK}或{result:FAIL}的JSON字符串,它与HTTP状态代码完全无关。