StringEntity 未在打印或套接字写入时对内容进行字符串化

StringEntity not stringifying content on print or socket write

我有一些 json 我正在尝试 return 作为 BasicHttpResponse 的一部分。 下面是一个代码片段,我已经对生成的打印输出进行了注释。

我可以在 A 中打印出 json,它在 1 中看起来不错。但是当我在 B 中打印实体时,我在 2 中没有得到任何实体,尽管它确实有长度。如果我进入调试器,我会在那里看到数据。

如果我更改内容类型并打印实体,我可以看到此更改反映在 3 中,但同样没有实际的字符串数据。

我正在尝试通过管道推送此数据,但在写入时不获取 json 正文有点问题。

我的期望是,当我向实体添加数据然后使用 HttpMessageWriter 打印或写入实体时,json 将是 shown/transferred。我错过了什么?期望 json 打印在 toString 上是不合理的吗?

     BasicHttpResponse resp;
     StringEntity entity = new StringEntity(json.toString(), "UTF-8");
A)   logger.info("to str: " + json.toString());
B)   logger.info("Entity: " + entity);
     entity.setContentType("application/json; charset=UTF-8");
     resp.setEntity(entity);
C)   logger.info("set entity " + resp.getEntity());



1)  to str: [{"id":"12","revision":"12","group":"12",
              "remote":"12"}]
2)  Entity: [Content-Type: text/plain; 
          charset=UTF-8,Content-Length: 81,Chunked: false]
3)  set entity [Content-Type: application/json; 
             charset=UTF-8,Content-Length: 81,Chunked: false] 

StringEntity 的 toString() 方法只会打印您获得的数据,这是正确的行为。

给StringEntity的String在对象中保存为字节数组

这是 StringEntity 的构造函数:

/**
 * Creates a StringEntity with the specified content and content type.
 *
 * @param string content to be used. Not {@code null}.
 * @param contentType content type to be used. May be {@code null}, in which case the default
 *   MIME type {@link ContentType#TEXT_PLAIN} is assumed.
 *
 * @throws IllegalArgumentException if the string parameter is null
 * @throws UnsupportedCharsetException Thrown when the named charset is not available in
 * this instance of the Java virtual machine
 * @since 4.2
 */
public StringEntity(final String string, final ContentType contentType) throws UnsupportedCharsetException {
    super();
    Args.notNull(string, "Source string");
    Charset charset = contentType != null ? contentType.getCharset() : null;
    if (charset == null) {
        charset = HTTP.DEF_CONTENT_CHARSET;
    }
    this.content = string.getBytes(charset);
    if (contentType != null) {
        setContentType(contentType.toString());
    }
}

如果您想再次将您的实体打印为 json(例如用于记录,因为它已经在响应中设置),您必须执行以下操作:

logger.info("Entity: " + IOUtils.toString(entity.getContent()));

使用IOUtils.toString因为entity.getContent()带了一个InputStream对象,你想怎么用就怎么用。