【问题标题】:How to set request body in Camel Restlet?如何在 Camel Restlet 中设置请求正文?
【发布时间】:2018-12-08 11:13:51
【问题描述】:

我有一个简单的 Camel get 方法,我要做的就是将主体设置为 XSL 转换的结果。我该怎么做呢? 以下代码无法编译,但它显示了我想要实现的目标:

rest("/api")
    .get("/booksByAuthor/{author}")
    .route()
    .setBody(
        from("file:/conf.xml")
        .setHeader("author",simple("${header.author}"))
        .to("xslt:/transformers/booksByAuthor.xsl")
    );

【问题讨论】:

  • 不应该是post 而不是get,如果你想在请求中设置正文?
  • @SukhpalSingh get 很好。 setBody 指的是沿骆驼路线传递的消息的正文,而不是 http 请求的正文。

标签: java apache-camel restlet


【解决方案1】:

您可以使用处理器将正文设置为 xml 文件,然后将其传递给您的 xslt。您不需要在消息正文中包含文件内容,对于“xslt:”,只需一个文件句柄就足够了。类似的东西

    rest("/api")
        .get("/booksByAuthor/{author}")
        .route()
        .process(exchange -> exchange.getIn().setBody(new File("/conf.xml")))
        .to("xslt:/transformers/booksByAuthor.xsl");

作者已经在邮件标题中,所以你不需要设置它,你可以在你的 xslt 中访问它

    <xsl:param name="author"/>
    <xsl:value-of select="$author"/>

我刚刚将处理器编写为 Java 8 lambda,但如果您愿意,您始终可以使用单独的类。

如果您想将 xml 文件的来源放入消息中,而不是使用文件句柄,您可以使用 pollEnrich 来读取文件。然后,您需要使用聚合策略来确保保留原始消息的标头。最简单的方法可能只是将带有 xml 的消息中的正文复制到原始消息中。以下是如何执行此操作的示例。

    rest("/api")
        .get("/booksByAuthor/{author}")
        .route()
        .pollEnrich("file:/?fileName=conf.xml&noop=true", (original, xml) -> {
                original.getIn().setBody(xml.getIn().getBody());
                return original;})
        .to("xslt:/transformers/booksByAuthor.xsl");

【讨论】:

  • 它给了我一个错误,说: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is序言中不允许。
  • @Dan 您可以将conf.xmlbooksByAuthor.xsl 文件添加到问题中吗?还要说明你使用的是什么版本的骆驼。
  • @Dan 我添加了一个替代方案,可以将 xml 文件读入正文。您可以在 xslt 步骤之前添加 .log("${body}") 以查看传入的 xml。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
相关资源
最近更新 更多