我对简单的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})");
}
}
答案 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");