【问题标题】:Detect the end of an HTTP Request in Java在 Java 中检测 HTTP 请求的结束
【发布时间】:2014-06-24 10:40:16
【问题描述】:

我正在尝试设计一个 Java 代理程序,但我的 Java 程序在读取整个 HTTP 请求时遇到问题。

我使用InputStream对象isObj尝试获取数据:

isObj.read(byteBuff)

但这通常会导致无法完全读取数据。即在 POST 请求的情况下,有时仅读取 HTTP 标头而未读取 POST 数据。所以,我尝试使用下面的方法来完全读取数据。

ByteArrayOutputStream baos=new ByteArrayOutputStream();
while((len=isObj.read(tempBuff))>0){
    baos.write(tempBuff,0,len);
}
byte[] byteBuff=baos.toByteArray();

不过,这个方法也被isObj.read(tempBuff)函数阻塞了。

尝试使用 DataInputStream 的另一种方法,例如:

DataInputStream dis=new DataInputStream(isObj);
byte[] byteBuff=new byte[8196];
dis.readFully(byteBuff);

这也在readFully() 函数中被阻止。

我通读并发现了这个

Detect end of HTTP request body

这表明原因是我们无法确定数据何时结束(除非是为了响应)。它要求我们使用 Content-Length 标头来检测最终长度。这绝对是读取 HTTP 请求的唯一方法吗?或者是否有任何其他库可以自动执行此操作?

【问题讨论】:

标签: java http httprequest


【解决方案1】:

您可以为此使用Apache's HttpComponents。 HttpCore 库提供了一个DefaultHttpRequestParser,它返回一个HttpRequest 实例,其中包含从请求中获取标头和字段的方法。

【讨论】:

  • 这是一个很好的建议,尽管 HttpClient 具体与这个问题并不真正相关。它是关于接收请求,而不是发送请求;)
  • 我正在尝试通过 HttpComponents,它通常处理客户端,而不是在服务器端做什么。正如@Gimby 提到的,有什么可以让我处理接收请求的。
  • 你实际上可以用它来解析HTTP请求,如hc.apache.org/httpcomponents-core-ga/tutorial/html/…中的3.1.3部分所示
  • 您应该使用相关信息更新您的答案。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
相关资源
最近更新 更多