我有两个应用。首先,它们执行一些业务逻辑,然后使用POST或DELETE调用其他应用程序
from("direct:firstapp").routeId("rst_firstapp").streamCaching()
//data preparation was here
.setHeader(Exchange.CONTENT_TYPE, simple(MediaType.APPLICATION_JSON_VALUE))
.convertBodyTo(MyRequest.class)
.choice().id("rst_req_lockCardChoice")
.when().simple("${mycondition} == '1'")
.setHeader(Exchange.HTTP_METHOD, simple("POST"))
.log(LoggingLevel.INFO, "Call post")
.when().simple("${mycondition} == '0'")
.setHeader(Exchange.HTTP_METHOD, simple("DELETE"))
.log(LoggingLevel.INFO, "Call delete")
.end()
.marshal(new JsonDataFormat(JsonLibrary.Jackson))
.log(LoggingLevel.INFO, " Call to service ${body}")
.to('myadress/mypath').id("rt_call_service")
.log(LoggingLevel.INFO, " Response from service ${body}");
以下行的日志:.log(LoggingLevel.INFO,“致电服务$ {body}”) 打印这两种情况下都存在该身体。
第二个应用程序收到此请求并执行其他一些业务逻辑。
rest().post("/mypath")
.consumes(MediaType.APPLICATION_JSON_VALUE)
.produces(MediaType.APPLICATION_JSON_VALUE)
.type(MyRequest.class)
.responseMessage().code("200").message("Success").endResponseMessage()
.route().routeId("rst_postrecieve")
.log(LoggingLevel.INFO, "Recieved request ${body}")
.id("rst_rst_post_recieved")
.to("direct:drt_rst_postbranch")
.endRest();
rest().delete("/mypath")
.consumes(MediaType.APPLICATION_JSON_VALUE)
.produces(MediaType.APPLICATION_JSON_VALUE)
.type(MyRequest.class)
.responseMessage().code("200").message("Success").endResponseMessage()
.route().routeId("rst_deleterecive")
.log(LoggingLevel.INFO, "Received request ${body}")
.id("rst_rst_delete_recieved")
.to("direct:drt_rst_deletebrach")
.endRest();
POST请求工作正常。 第一个应用发送正文。再来一次。
删除不。 第一个应用程序将切出身体。行.log(LoggingLevel.INFO,“致电服务$ {body}”)打印正文。但是接收者会收到一个带有空主体的DELETE请求。我已经用Wireshark嗅到了Http请求:主体是空的。
但是,我完全可以使用Swagger-ui,Postman,Soap-UI等任何其他工具与body发送一个DELETE请求。第二个应用程序将接收body并正确处理它。
为什么骆驼不允许接收DELETE正文,却允许它接收呢?我希望行为相同。
解决方法是什么?我无法更改请求类型,这是客户要求。
骆驼版本:2.21.0.000033-fuse-000001-redhat-1
P.S。我知道Http标准规定没有主体可以进行DELETE,但是我面对的所有工具和框架都允许发送和接收它。例如,包括Spring。
答案 0 :(得分:1)
在处理过程中,很有可能Delete方法将忽略主体。您的代码没有问题,这是由于HTTP实现。
如果DELETE请求包含实体主体,则该主体将被忽略[...]
如果您仍然需要将某些数据从一个应用程序发送到另一个应用程序,以使用Delete方法。我建议您可以尝试使用路径参数。这样一来,您就可以在第二个应用程序中获取参数并进行处理。