【问题描述】:

我将覆盖FilterClient,这样我就可以看到传入的请求。我想要一些方法来获取传入的ActionRequestString 表示形式。ActionRequest 让我们写信给StreamOuput,这是一种 Elasticsearch 类型是OutputStream 的子类。这个SO post 展示了如何将 OutputStream 转换为字符串,但由于 FilterClient API,我不得不使用 StreamOuput。 p>

我如何获得 ActionRequest 的字符串表示形式,或者至少是一个可读的版本,它将向我显示有关请求的有用信息? (调用 ActionRequest.toString 调用 Object.toString,这对我来说不够好。)

【问题讨论】:

  • StreamOuput 扩展了 OutputStream 所以你不能把它用作 OutputStream 吗?
  • 我不明白你的建议。我链接到的 SO 帖子建议使用 ByteArrayOutputStream。但是您不能在需要 StreamOutput 的地方使用 ByteArrayOutputStream。也许您可以在解决方案中包含一些代码,以便我理解。

标签: java elasticsearch java-stream


【解答1】:

StreamOutput 是一个抽象类,它有一个名为OutputStreamStreamOutput 的子类。后者基本上是 OutputStream 的包装器,因此您将创建一个包装 ByteArrayOutputStream 的实例,然后在 ActionRequest.writeTo() 调用。

// in your override doExecute method, add this:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStreamStreamOutput osso = new OutputStreamStreamOutput(baos);

request.writeTo(osso);
String requestAsString = baos.toString("UTF-8");

【问题讨论】:

  • 这看起来与我需要的很接近,但我在输出中得到了一堆“s”。我认为它输出了正确的请求字段名称,但值都是乱码。有什么想法吗?
  • 也许你得到的内容是二进制的而不是文本的......或者根本没有用 UTF-8 编码
  • 是否有特定的标志/配置设置了 Elasticsearch 请求的编码?
  • 你能分辨出你拦截的是哪个请求吗?
  • 请求可以是一堆不同的请求类型,包括SearchRequestBulkRequestMultiGetRequest。这是你的意思吗?