spring XD - http-client 添加 application/json header
spring XD - http-client add application/json header
我已经在我的 PaaS 环境中安装了 Spring XD,但由于遗留问题,我一直使用 1.0.0.M1 版本。 (参见 reference doc)。
我的目标是使用 http-client
模块调用 http rest API。我的流定义是:
http | httpclient --url='''<my_url>''' --http-method=POST --mappedRequestHeaders=HTTP_REQUEST_HEADERS | log --expression=#root
不幸的是,由于 http
模块仅将有效负载发送到 httpclient
,httpclient
returns 由于缺少 [=44] 而导致 415 错误=] header.
考虑到我既不能添加新模块也不能修改现有模块(在这样的版本中你只能参考spring仓库),我想使用一个tranform
模块来注入content-type header.
我怎样才能实现这样的目标?
非常感谢您的帮助。
编辑:
我刚发现httpclient processor (link) 支持headersExpression SpEL 表达式,用于派生http headers 映射使用。然而:
--headers-expression='{Content-Type:'application/json'}'
给出以下解析异常:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:
(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
有关更多 StackTrace,请参阅 GH issue。
首先,它不再是 Spring XD。 Spring Cloud Dataflow 是不同的产品,它的行为可能与您之前使用 Spring XD 的行为不同。
其次:已经是1.0.0.RC1
版本了。所以,考虑升级。
现在开始讨论问题。看:
headersExpression
A SpEL expression used to derive the http headers map to use.
所以,这个表达式必须return一个Map
并且由代码确认:
if (properties.getHeadersExpression() != null) {
Map<?, ?> headersMap = properties.getHeadersExpression().getValue(message, Map.class);
现在我们来看看问题所在:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.OpMinus.getValueInternal(OpMinus.java:98) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
OpMinus
是一个根源。因此,SpEL 将 Content-Type
表达式视为 minus
运算符。
当然很难过,但解决方法就像将 key
也用引号引起来:
--headers-expression={'Content-Type':'application/json'}
我已经在我的 PaaS 环境中安装了 Spring XD,但由于遗留问题,我一直使用 1.0.0.M1 版本。 (参见 reference doc)。
我的目标是使用 http-client
模块调用 http rest API。我的流定义是:
http | httpclient --url='''<my_url>''' --http-method=POST --mappedRequestHeaders=HTTP_REQUEST_HEADERS | log --expression=#root
不幸的是,由于 http
模块仅将有效负载发送到 httpclient
,httpclient
returns 由于缺少 [=44] 而导致 415 错误=] header.
考虑到我既不能添加新模块也不能修改现有模块(在这样的版本中你只能参考spring仓库),我想使用一个tranform
模块来注入content-type header.
我怎样才能实现这样的目标?
非常感谢您的帮助。
编辑:
我刚发现httpclient processor (link) 支持headersExpression SpEL 表达式,用于派生http headers 映射使用。然而:
--headers-expression='{Content-Type:'application/json'}'
给出以下解析异常:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:
(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
有关更多 StackTrace,请参阅 GH issue。
首先,它不再是 Spring XD。 Spring Cloud Dataflow 是不同的产品,它的行为可能与您之前使用 Spring XD 的行为不同。
其次:已经是1.0.0.RC1
版本了。所以,考虑升级。
现在开始讨论问题。看:
headersExpression
A SpEL expression used to derive the http headers map to use.
所以,这个表达式必须return一个Map
并且由代码确认:
if (properties.getHeadersExpression() != null) {
Map<?, ?> headersMap = properties.getHeadersExpression().getValue(message, Map.class);
现在我们来看看问题所在:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 1): Property or field 'Content' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
org.springframework.expression.spel.ast.OpMinus.getValueInternal(OpMinus.java:98) ~[spring-expression-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
OpMinus
是一个根源。因此,SpEL 将 Content-Type
表达式视为 minus
运算符。
当然很难过,但解决方法就像将 key
也用引号引起来:
--headers-expression={'Content-Type':'application/json'}