我想在使用Camel Rest端点时记录原始的'原始'请求正文(例如JSON)。什么是正确的方法来做到这一点?如何在使用Camel Rest时记录请求负载?
我的设置(RouteBuilder)看起来是这样的:
restConfiguration().component("jetty")
.host(this.host)
.port(this.port)
.contextPath(this.contextPath)
.bindingMode(RestBindingMode.json);
rest("myService/").post()
.produces("application/json; charset=UTF-8")
.type(MyServiceRequest.class)
.outType(MyServiceResponse.class)
.to(SERVICE_CONTEXT_IN);
from(SERVICE_CONTEXT_IN).process(this.serviceProcessor);
我在这里的问题是,机械师如存储要求为Exchange媒体都在使用这种方法,任何处理器的术语“为时已晚”在路线中已经太迟了,即,绑定已经发生并且消耗了请求。此外,CamelHttpServletRequest的InputStream已经被读取并且不包含数据。
使用的日志EIP的第一个位置直接地是单处理器之前:
from(SERVICE_CONTEXT_IN).log(LoggingLevel.INFO, "Request: ${in.body}")
.process(this.serviceProcessor);
但是在该点的${in.body}
已经是MyServiceRequest
一个实例。上面添加的日志简单地产生Request: [email protected]
。我想记录的是在绑定到POJO之前的原始JSON。
在RestConfigurationDefinition或RestDefinition中似乎没有启用“原始”请求记录的内置方式。
我可以摆脱自动JSON绑定,并手动读取HTTP Post请求的InputStream,记录和执行手动解组等,但我想保持内置绑定。
如果你使用的是logback和jetty 7(也许是8),你可能会看看[logback-access](http://logback.qos.ch/access.html)。根据[Camel-Jetty文档](http://camel.apache.org/jetty.html),Camel(特别是DefaultHttpBinding)会将输入流复制到放入消息正文中的sream缓存中。从他们你可以简单地使用'.log(LoggingLevel.Debug,“$ {in.body}”)''来记录它。除此之外,Camel会将HTTP头自动复制到您可以像普通交换头一样访问的交换头。 –
通过记录最初的原始请求,不能确定你的意思吗?您可以从()中记录原始有效负载。可以从Exchange头文件/属性访问HTTP头文件。你还想记录什么? –
@ roman-vottner我编辑的问题包括骆驼的日志EIP以及它不会产生预期效果的事实。尽管如此,我还没有尝试过logback-access。 – ahor