【问题标题】:How to read a textual HTTP response into a String exactly as-is?如何按原样将文本 HTTP 响应读入字符串?
【发布时间】:2013-03-02 15:30:41
【问题描述】:

以下代码使用 BufferedReader 从 HTTP 响应流中读取:

final StringBuilder responseBuilder = new StringBuilder();
String line = bufferedReader.readLine();
while (line != null) {
    responseBuilder.append(line);
    responseBuilder.append('\n');
    line = bufferedReader.readLine();
}
response = responseBuilder.toString();

但是将'\n' 附加到每一行似乎有点缺陷。我想完全按原样返回 HTTP 响应,那么如果它在最后一行之后没有返回字符怎么办?无论如何都会使用上面的代码添加一个 - 有没有更好的方法?

【问题讨论】:

  • 我相信你得到了 html “文本”?那正确吗?您添加\n 是因为您希望它以“人类”可读的形式出现吗?因为即使没有换行符,任何解析器都应该处理响应
  • 是的,内容类型是text/xml。出于系统工作的目的,它实际上并不需要人类可读,但它被记录到日志文件中,因此需要这样做。
  • 好吧,那么我建议通过“漂亮打印”库运行它(也照顾 ident)。我认为sourceforge.net/projects/jtidy 会很漂亮。只需将整个响应粉碎并请求漂亮的打印输出

标签: java bufferedreader readline eof carriage-return


【解决方案1】:

我想按原样返回 HTTP 响应

那么不要使用readLine() - 就这么简单。我建议改用StringWriter

StringWriter writer = new StringWriter();
char[] buffer = new char[8192];
int charsRead;
while ((charsRead = bufferedReader.read(buffer)) > 0) {
    writer.write(buffer, 0, charsRead);
}
response = writer.toString();

请注意,如果编码错误,即使这样也行不通。要保留准确 HTTP 响应,您需要将其作为二进制 流进行读取(和写入)。

【讨论】:

  • 要保留准确的 HTTP 响应,您需要读取字节,而无需调解 Reader,并且您还需要注意 Content-Length 问题。
  • @EJP - 我确实遇到了 Content-Length 问题,在之前的 q 中提出:stackoverflow.com/questions/14817310/… 这与您所指的问题相同吗?
  • @EJP:同意事物的二进制方面 - 请参阅我答案的结尾。对于内容长度,我期望读者已经做了正确的事情。
  • 什么读者?如果输入来自 HttpURLConnection ,这一切都发生在你身上,但如果它是一个套接字,它就不会:你必须在 Content-length 处停止读取(如果有的话),自己处理分块编码等;否则你可以超越正文并开始阅读下一个请求。这里没有证据表明它是什么。
猜你喜欢
  • 2018-11-23
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2017-09-12
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多