骆驼休息。可以在DELETE上接收遗体,但不能发送

时间:2018-07-20 08:52:51

标签: java http apache-camel

我有两个应用。首先,它们执行一些业务逻辑,然后使用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。

1 个答案:

答案 0 :(得分:1)

在处理过程中,很有可能Delete方法将忽略主体。您的代码没有问题,这是由于HTTP实现。

  

如果DELETE请求包含实体主体,则该主体将被忽略[...]

如果您仍然需要将某些数据从一个应用程序发送到另一个应用程序,以使用Delete方法。我建议您可以尝试使用路径参数。这样一来,您就可以在第二个应用程序中获取参数并进行处理。