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

时间:2015-05-22 14:00:47

标签: java apache-httpcomponents

我有一些json我试图作为BasicHttpResponse的一部分返回。 下面是代码snippit,我已经注释了生成的打印输出。

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

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

我正在尝试通过管道推送这些数据而不是在写入时获取json主体是一个问题。

我的期望是,当我向实体添加数据然后使用HttpMessageWriter打印或编写实体时,将显示/传输json。我错过了什么?期望将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] 

1 个答案:

答案 0 :(得分:3)

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对象,你可以随意使用它。