【问题标题】:Apache Camel Rest send response for post requestApache Camel Rest 发送对发布请求的响应
【发布时间】:2019-12-11 15:53:15
【问题描述】:

我有一个骆驼端点,另一个应用程序发送带有一些数据的发布请求(可能使用其他路由)

我想处理这些数据并通过 POST 请求的响应将某些内容返回给应用程序。

这就是我的骆驼上下文目前的样子:

 <camelContext xmlns="http://camel.apache.org/schema/blueprint">

    <restConfiguration component="restlet" bindingMode="json" port="8989" enableCORS="true"/>

    <rest path="/finData">
      <description>User rest service</description>
      <post>
        <to uri="direct:update"/>
      </post>
    </rest>

    <route id="sendFinData">
      <from uri="direct:update"/>
      <log message="Got some data:  ${body}"/>
      <to uri="aclient://otherClient"/>
    </route>

  </camelContext>

如何通过 post 请求的响应从路由 sendFinData 发回一些答案?

【问题讨论】:

    标签: rest apache-camel camel-rest


    【解决方案1】:

    对您的路由的发布请求收到的响应是路由末尾 ${body} 中的任何内容。

    因此,在您的路线结束时,${body} 包含来自

    的任何响应
    <to uri="aclient://otherClient"/>
    

    我不使用 Camel XML,但在 Java 中你会这样做:

        rest("/finData")
            .get()
            .route()
            .to("direct:sendFindData")
            .end();
    
        from("direct:sendFindData")
            .to("aclient://otherClient")
            .process(exchange -> exchange.getIn().setBody("Hello world"))
            .setBody(simple("GoodBye world")) // same thing as line above
            .end();
    

    如果您要传回给请求者的数据不是您路由中最后一次 API 调用的响应,您需要将其临时保存在某处(exchange.properties)并稍后将其设置回正文,或聚合响应以便原始数据不会被覆盖。路由应该产生消费者期望的数据。对于正常的休息请求,这应该是字符串类型(如“GoodBye world”)。例如,如果要返回 JSON,请确保响应正文是路径末尾的 JSON 字符串。

    抱歉,我无法为 XML 提供帮助,但希望这对您有所帮助。

    【讨论】:

    • 您好,这对理解有很大帮助。但不幸的是,我不明白从外部骆驼路由器修改 Body。我试过:&lt;route id="receiveFinData"&gt; &lt;from uri="aserver://0.0.0.0:9191"/&gt; &lt;log message="Received data: ${body}"/&gt; &lt;setBody&gt; &lt;simple&gt;{"result": true }&lt;/simple&gt; &lt;/setBody&gt; &lt;/route&gt; 但这似乎不起作用(身体与第一条路线相同)。如果我尝试使用内部路由 &lt;setBody&gt; 工作
    • 外部骆驼路由器是什么意思?您是否有一个单独的骆驼实例接收来自的请求。您能否也提供该端点的代码。 &lt;setBody&gt; &lt;simple&gt;{"result": true }&lt;/simple&gt; &lt;/setBody&gt; 也不是有效的字符串。你试过用普通字符串&lt;simple&gt;"hello"&lt;/simple&gt;
    【解决方案2】:

    如果您需要发回响应作为对包含自定义数据的发布请求的确认 然后使用 transform 改变 ${body} 你想要的

    <route id="sendFinData">
          <from uri="direct:update"/>
    <log message="Got some data:  ${body}"/>
    <transform>
                <simple>
                    I got some data     
                </simple>
        </transform>
        </route>
    

    上面会将修改后的响应作为 ack 发送回请求

    如果您想回复并保留原始数据以转发到其他路由或存储 然后使用带变换的多播

    <route id="sendFinData">
              <from uri="direct:update"/>
        <log message="Got some data:  ${body}"/>
    <multicast>
    <to uri="aclient://otherClient"/>
        <transform>
                    <simple>
                        I got some data     
                    </simple>
            </transform>
    </multicast>
            </route>
    

    上面将发送一个响应作为对请求的确认,并将原始数据转发给 otherClient (uri="aclient://otherClient")

    或者如果您想将修改后的正文发送到 uri="aclient://otherClient",然后在转换后发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2014-12-08
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多