我试图设计一个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请求的唯一方法吗?或者是否有其他库自动执行此操作?
答案 0 :(得分:5)
您可以使用Apache's HttpComponents。 HttpCore库提供了一个DefaultHttpRequestParser,它返回一个HttpRequest实例,其中包含从请求中获取标题和字段的方法。