我的问题是,如果Ring请求的主体已经被读取,我该如何习惯性地阅读它?
这是背景。我正在为Ring应用程序编写错误处理程序。当发生错误时,我想记录错误,包括所有可能需要重现和修复错误的相关信息。其中一个重要的信息是请求的主体。然而,:body
值的状态性(因为它是java.io.InputStream
对象的一种类型)会导致问题。
具体来说,发生的情况是某些中间件(在我这种情况下是ring.middleware.json/wrap-json-body
中间件)对主体InputStream
对象进行了一次slurp
,这会更改对象的内部状态,从而使将来的调用slurp
返回一个空字符串。因此,请求映射中的主体[内容]实际上已丢失。
我唯一能想到的解决方案是在主体可以被读取之前预先复制主体InputStream
对象,以防以后可能需要它。我不喜欢这种方法,因为它似乎笨拙,需要在每个请求上做一些工作,以防以后可能出现错误。是否有更好的方法?
tee-stream
。感谢您提供这个,以及groundhog
。我接受了这个答案,并将详细说明我的方法在另一个答案中。 - Jeff Terrell Ph.D.