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对象,你想怎么用就怎么用。
我有一些 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对象,你想怎么用就怎么用。