需要一些帮助,我目前编写了一个HTTP服务器。它可以很好地处理GET请求。然而,在使用POST时,缓冲读取器似乎会挂起。当请求停止时,剩余的输入流通过缓冲读取器读取。我在谷歌上找到了一些东西。我尝试过更改CRLF和协议版本从1.1到1.0(浏览器自动将请求作为1.1),但没有效果。有什么建议或帮助将不胜感激。谢谢
需要一些帮助,我目前编写了一个HTTP服务器。它可以很好地处理GET请求。然而,在使用POST时,缓冲读取器似乎会挂起。当请求停止时,剩余的输入流通过缓冲读取器读取。我在谷歌上找到了一些东西。我尝试过更改CRLF和协议版本从1.1到1.0(浏览器自动将请求作为1.1),但没有效果。有什么建议或帮助将不胜感激。谢谢
如果需要,可以查看以下现有组件,而不必编写自己的实现:
这并不安全!但是展示了如何在初始HTTP头之后的输入流中获取POST数据。
这仅适用于作为“example=true&bad=false”等形式进入的POST数据。
private HashMap hashMap = new HashMap();
private StringBuffer buff = new StringBuffer();
private int c = 0;
private String[] post; public PostInputStream(InputStream in) {
try {
//Initalizes avaliable buff
if (in.available() != 0) {
this.buff.appendCodePoint((this.c = in.read()));
while (0 != in.available()) {
//Console.output(buff.toString());
buff.appendCodePoint((this.c = in.read()));
}
this.post = buff.toString().split("&");
for (int i = 0; i < this.post.length; i++) {
String[] n = this.post[i].split("=");
if (n.length == 2) {
hashMap.put(URLDecoder.decode(n[0], "UTF-8"), URLDecoder.decode(n[1], "UTF-8"));
} else {
Console.error("Malformed Post Request.");
}
}
} else {
Console.error("No POST Data");
}
} catch (Exception e) {
e.printStackTrace();
}
}
正如karoroberts所说,您需要检查POST中发送内容的长度。但是您仍然可以使用BufferedReader。
只需检查Content-Length头文件的大小并在完成读取所有头文件后,您可以设置一个相同大小的char数组并进行POST内容的读取:
char [] buffer = new char [contentLength]; request.read(buffer);
其中request为BufferedReader。 如果您需要将POST内容作为字符串使用,可以使用:String.valueOf(buffer);
注意:BufferedReader.read返回读取的字符数int,因此您可以在那里检查与Content-Length头文件不一致的地方。