我有一些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]
答案 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对象,你可以随意使用它。