为什么我不能从java中的POST请求中读取正文?

时间:2012-10-04 04:36:36

标签: 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];
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部分,因为没有问题。)

结果

Result

Result

2 个答案:

答案 0 :(得分:2)

问题是你仍然需要在InputStream上阅读。这就是为什么当你关闭浏览器时,没有别的东西可以阅读,所以打印出来。您必须准确读取“Content-Length”

中声明的字节数

尝试这样的事情:

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字符串中。

答案 1 :(得分:0)

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

  1. 接受传入的连接。对于每个连接:
  2. 阅读HTTP CONNECT请求。
  3. 连接到CONNECT请求中指定的目标主机,并向客户端发送适当的响应。
  4. 如果连接成功,请同时在两个方向上复制上游服务器和下游客户端之间的 bytes
  5. 当您向一个方向读取EOS时,请关闭相对的插槽以进行输出。
  6. 当您双向关闭时,请关闭两个插槽。
  7. 就是这样。没有解析POST请求或任何其他要求。甚至不是读者。