为什么可以';我不能用java读取POST请求中的正文吗?
代码为什么可以';我不能用java读取POST请求中的正文吗?,java,http,post,Java,Http,Post,代码 public HttpRequest(BufferedReader from) { String firstLine = ""; try { firstLine = from.readLine(); } catch (IOException e) { System.out.println("Error reading request line: " + e); } String[] tmp = firstLine.split(" "); method = tmp[0];
public HttpRequest(BufferedReader from) {
String firstLine = "";
try {
firstLine = from.readLine();
} catch (IOException e) {
System.out.println("Error reading request line: " + e);
}
String[] tmp = firstLine.split(" ");
method = tmp[0];
URI = tmp[1];
version = tmp[2];
System.out.println("URI is: " + URI);
if(method.equals("POST")){
try {
String line = from.readLine();
while (line.length() != 0) {
headers += line + CRLF;
if (line.startsWith("Host:")) {
tmp = line.split(" ");
if (tmp[1].indexOf(':') > 0) {
String[] tmp2 = tmp[1].split(":");
host = tmp2[0];
port = Integer.parseInt(tmp2[1]);
} else {
host = tmp[1];
port = HTTP_PORT;
}
}
line = from.readLine();
}
headers += "Connection: close" + CRLF;
headers += CRLF;
}
catch (IOException e) {
System.out.println("Error reading from socket: " + e);
return;
}
}
else {
System.out.println("Error: Method not supported");
return;
}
System.out.println("Host to contact is: " + host + " at port " + port);
}
问题
我正在使用Java制作一个代理服务器
上面的代码处理HTTP POST请求。它成功读取POST标题并在命令提示符下打印,但缺少正文
你能看看我的代码,看看问题所在吗?谢谢
(注意:我排除了GET部分,因为它没有问题。)
结果
这不是如何编写代理服务器。代理服务器只需执行以下操作:
就这样。不需要解析POST请求或任何其他要求。甚至连一个阅读器都没有。问题是,在InputStream上仍然有东西要读。这就是为什么当你关闭浏览器时,没有其他东西可以阅读,所以打印出来。您必须准确读取“内容长度”中声明的字节数 试着这样做:
int cL = Integer.valueOf(contentLength);
byte[] buffer = new byte[cL];
String postData = "";
System.out.println("Reading "+ cL + "bytes");
in.read(buffer, 0, cL);
postData = new String(buffer, 0, buffer.length);
System.out.println(postData);
正文请求将在postData字符串中。能否编辑上面的内容以显示您收到的输出完成。请检查结果部分。将(line.length()!=0)更改为(line=from.readLine())!=null)使用line.length()!=如果出于某种原因,文章正文前有一个空行,0可能会导致问题。标题和正文之间不总是有一个空行吗?我会注意的。但是在我的问题的上下文中,您能说一下我在将post请求主体作为字符串获取时所做的工作有什么错吗?谢谢,我的回答中隐含着这个问题的答案。你做错了的是写了很多不必要的代码来做一些不必要的事情,比如把POST请求主体作为字符串,而你所要做的只是复制字节,而不管它是get、PUT、POST、HEAD、DELETE。。。或者在标题和主体所在的位置。不需要任何人调试代码,你应该扔掉。