从HTTP post requestH中提取正文

时间:2015-12-07 20:55:02

标签: java http post request server

在尝试提取给定的主体时,我遇到了一个奇怪的问题 HTTP发布请求。

如果我尝试仅提取标题,则可以正常工作。当我尝试提取正文时,方法会阻塞(甚至认为流中仍有数据)。

这是我的代码:

private void extractHeader() throws Exception {
    StringBuffer buffer = new StringBuffer();
    InputStreamReader reader = new InputStreamReader(socket.getInputStream());
    BufferedReader bufferedReader = new BufferedReader(reader);

    boolean extractBody = false;
    int bodyLength = 0;
    String line;

    while (!(line = bufferedReader.readLine()).equals("")) {
        buffer.append(line + "");
        if (line.startsWith("POST")) {
            extractBody = true;
        }
        if (line.startsWith("Content-Length:")) {
            bodyLength = Integer.valueOf(line.substring(line.indexOf(' ') + 1, line.length()));
        }
    }
    requestHeader = buffer.toString();

    if (extractBody) {
        char[] body = new char[bodyLength];
        reader.read(body, 0, bodyLength);
        requestBody = new String(body);
    }
}

这是请求请求:

POST /params_info.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/index.html
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31

firstname=Mickey&lastname=Mouse

根据我的理解,循环将一直持续到看到空字符串 然后停下来。在这个阶段,读者可以阅读内容长度'字节数。所以阅读身体和完成应该没有问题。相反,它会阻止线路上的“阅读器”(body,0,bodyLength);' (我不使用readLine()的原因是因为body不以\ n开头。

我尝试过以各种方式调试它但我一无所获。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您正在使用bufferedReader

阅读标题
while (!(line = bufferedReader.readLine()).equals("")) {

但是使用reader来阅读正文,该bufferedReader没有可用的数据,因为 reader.read(body, 0, bodyLength); 已经读取并缓存了这些内容:

    bufferedReader.read(body, 0, bodyLength);

将该行更改为

app.get('/fetching', function(req, res){
    connection.fetcher(function(data)
        {
            res.render("testing.html",data);
        }
    );
});