2015-05-22 47 views
1

我有一些json我试图返回作为BasicHttpResponse的一部分。 代码snippit在下面,我注释了打印结果。StringEntity没有字符串打印或套接字写内容

我可以打印出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] 

回答

3

StringEntity的toString()方法将只打印您获取的数据,即正确的行为。

给予StringEntity的字符串在对象中保存为字节数组。

这是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())); 

使用自entity.getContent IOUtils.toString()带来的InputStream对象,你可以根据需要使用它。

+0

谢谢。总有一个问题需要解决。我认为这是简单的版本,但数据不是通过套接字发送的。我会尽力追踪并更新问题或提出新问题。 –

+0

是的,这很可能是一个完全不同的问题:)祝你好运:) –