为什么可以';我不能用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部分,因为它没有问题。)

结果


这不是如何编写代理服务器。代理服务器只需执行以下操作:

  • 接受传入连接。对于每个连接:
  • 读取HTTP连接请求
  • 连接到连接请求中指定的目标主机,并向客户端发送适当的响应
  • 如果连接成功,则在上游服务器和下游客户端之间同时向两个方向复制字节
  • 当您在一个方向上读取EOS时,关闭另一个插座进行输出
  • 当两个方向都关机时,关闭两个插座

  • 就这样。不需要解析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。。。或者在标题和主体所在的位置。不需要任何人调试代码,你应该扔掉。