Apache Camel:引号将破坏URI

时间:2018-07-10 13:37:12

标签: java json apache-camel

我对简单的Apache Camel HTTP-> Python-> HTTP路由有疑问。

目标是建立一个骆驼路线,该路线使用JSON接受两个乘法因素。格式如下:{"a":5,"b":5}

然后将传递的JSON对象传递给Python脚本,在该脚本中计算两个因素的乘积,然后将结果作为JSON对象返回。

当我向Camel发出POST请求并将上述JSON传递给正文时,我在Camel中收到一条错误消息。

14:33:33.474 [Restlet-698774930] ERROR org.apache.camel.component.exec.ExecProducer - The command ExecCommand [args=[src/main/resources/post.py, RAW({, a, :1,, b, :100})], executable=python, timeout=9223372036854775807, outFile=null, workingDir=null, useStderrOnEmptyStdout=false] returned exit value 1

问题似乎出在引号上。 这些确保JSON对象不会被识别为一个参数,而是被拆分为多个参数。

在Camel的文档中,您会找到有关“ RAW()”的内容,在这种情况下不起作用。

当然,Python脚本之所以死亡,是因为第二个参数不是JSON对象。但是,如果您从命令行手动运行它,则不会出现问题。这意味着错误不在脚本中,而是在Camel的调用中。

package com.sample.simplecalc;

import org.apache.camel.builder.RouteBuilder;

public class MyRouteBuilder extends RouteBuilder {

  public void configure() throws Exception{

    restConfiguration()
    .component("restlet")
    .host("localhost").port("8080")
    .enableCORS(false)
    ;

    rest().path("/api").produces("application/json").consumes("application/json")
    .get()
        .toD("exec:python?args=src/main/resources/get.py")
    .post()
        .toD("exec:python?args=src/main/resources/post.py RAW(${body})");
  }

}

2 个答案:

答案 0 :(得分:1)

您可以在将消息正文传递给脚本之前尝试将其作为JSON封送。

.post()
    .marshal().json()
    .toD("exec:python...")

有关选项依赖性等,请参见Camel JSON page

答案 1 :(得分:0)

这是我们的解决方案:
我们已经开始了一个返回Python脚本返回值的过程。

.post()
    .to("direct:process");
from("direct:process")
    .process(new Processor() {
        public void process(Exchange exchange) {
            String payload = exchange.getIn().getBody(String.class);
            List<String> args = new ArrayList<String>();
            args.add("src/main/resources/post.py");
            args.add(payload);
                exchange.getOut().setHeader(ExecBinding.EXEC_COMMAND_ARGS, args);
        }
    })
    .toD("exec:python");