Spring Cloud数据流HttpClient

时间:2018-08-08 20:20:00

标签: spring-integration spring-el spring-cloud-dataflow

我有以下信息流。 问题的背景

1。

rabbit --password='******' --queues=springdataflow-q --virtual-host=springdataflow --host=172.24.172.184 --username=springdataflow | transform | httpclient --url-expression='http://172.20.24.47:8080/push' --http-method=POST --headers-expression={'Content-Type':'application/x-www-form-urlencoded'} --body-expression={arg1:payload} | log

2。

我的Spring Boot在本地运行。

@RestController
public class HelloController {



    @RequestMapping(value = "/push", method = RequestMethod.POST,produces = {MediaType.TEXT_PLAIN})
      public String pushMessage(@RequestParam(value="arg1") String payload) {
        System.out.println(payload);
        return payload;
      } 
}
  1. 我希望让Rabbit消息作为发布请求中'arg1'参数值的值进入httpclient中。目的是发布在兔子队列上的消息被其余的发布点消耗,该消息被SpEL有效负载捕获。

为此,我正在使用body-expression = {arg1:payload},但是这不起作用,可能在语法上是错误的。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

@RequestParam(value="arg1")实际上是关于请求参数的,它是?之后的URL的一部分,称为query stringhttps://en.wikipedia.org/wiki/Query_string

因此,如果您确实希望在查询字符串中有一对arg1=payload,则需要使用适当的url-expression

--url-expression='http://172.20.24.47:8080/push?arg1='+payload

答案 1 :(得分:0)

这似乎可以将字符串作为有效载荷传递。似乎默认情况下,有效负载将成为requestbody。 因此,在其余服务上,我进行了更改:     @RequestMapping(value =“ / pushbody”,method = RequestMethod.POST,consumes = {MediaType.TEXT_PLAIN})       公共字符串pushBody(@RequestBody字符串有效负载){         System.out.println(有效载荷);         返回有效载荷;       }

现在看来有效的流是: rabbit --password ='******'--queues = springdataflow-q1 --host = 172.24.172.184 --virtual-host = springdataflow --username = springdataflow | httpclient --http-method = POST --headers-expression = {'Content-Type':'text / plain'} --url = {http://172.20.24.47:8080/pushbody |日志

我确实尝试在httpclient和logsink上使用inputType = text / plain建议,并删除了其余服务post方法上的消耗和产生,但是没有运气。