如何在JAVA中获得正确的HTTP响应?

时间:2012-08-14 15:51:49

标签: java sockets httpresponse urlconnection

我想在网页上获取一些数据,所以我使用java向服务器发送http请求

我尝试过URLConnection和Jsoup,但他们都无法得到正确的回复

如果在浏览器中浏览网址

http://www.hkprinters.org/en/member_search.asp?page=1&mode=view

响应正确,获得搜索结果

但是使用java,我只能得到搜索,没有结果。

为什么回答不正确以及如何获得正确的回复?

import java.io.*;
import java.util.*;
import java.net.*;
import org.json.*;

class HttpRequest
{
    public static void main(String[] args) throws Exception
    {
        URL url = new URL("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.flush();

        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("station.txt")));

        String line;
        while((line=rd.readLine())!=null)
        {
            out.write(line);
        }
        out.close();
    }


}






import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.jsoup.*;

public class read_line2 {

    public static void main(String args[]) {
        try {
            Document doc = Jsoup.connect("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view").get();
            Document doc = Jsoup.parse(input, null);
            Elements newHeadlines = doc.select("*");
            System.out.println(newHeadlines);

        } catch (Exception e) {
        }
    }
}

更新

我想先解释正确和错误的结果。

正确的是搜索表单+搜索结果数据(例如公司名称,地址,电话),我想要这些数据。

不正确的是:

<title>db</title>
<title>func</title>
<!DOCTYPE HTML PUBLIC
........
<input type="hidden" name="hdnMode" value="search"/></form>
</table>
<font size="2"><br/>

如果您使用浏览器查看,则只能看到搜索表单,没有结果。

新发现是:我现在可以使用浏览器来获取错误的结果。如果您关闭浏览器并再次打开,然后浏览http://www.hkprinters.org/en/member_search.asp?page=1&mode=view

然后你会得到不正确的结果,这个结果与JAVA结果完全相同

<title>db</title>
<title>func</title>
<!DOCTYPE HTML PUBLIC
........
<input type="hidden" name="hdnMode" value="search"/></form>
</table>
<font size="2"><br/>

现在,如果您可以点击提交(不需要输入任何内容),那么搜索结果将再次显示,现在即使您只浏览http://www.hkprinters.org/en/member_search.asp?page=1&mode=view(获取方法),搜索结果仍会显示。

所以我猜这个页面在第一次点击提交按钮时将帖子数据保存到会话中,之后,每次我浏览这个页面时,都会从会话中找到搜索键,所以即使我使用get方法发送页面和模式,它仍然给我搜索结果。

但我不知道如何使用JAVA实现相同的会话,任何一个例子呢?

5 个答案:

答案 0 :(得分:2)

如果您未在请求中发送任何内容,请注释以下行:

conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.flush();

答案 1 :(得分:1)

我建议使用Apache http client.
您可以更好地控制您正在使用的HTTP方法(GET,PUT等) 此HTTP客户端被广泛使用。
您将有更好的API来处理响应(当然可以使用URLConnection,但这个框架简化了事情。

答案 2 :(得分:1)

尝试使用java.net.HttpURLConnection而不是URLConnection。

答案 3 :(得分:1)

我检查了提供的URL的源代码。它在HTML标记中有一些错误。在某些浏览器中,表单未被子设置的原因可能是这样。这取决于您的浏览器如何通过不良标记来实现宽松。例如,元素在/ tr和tr元素之间定义,它表示在表中:

...
</tr>
<form action="member_search.asp" method="post" name="frmSearch" 
    onSubmit="return checkSearchForm();">
<tr class="copy"> 
...

我还可以看到用于提交的方法是POST,但我没有在您的代码中看到任何提供搜索参数的设置,如搜索表单所示。

我的建议是,您尝试检查您的客户请求到您可以证明生成良好的其他页面。

答案 4 :(得分:0)

写完之后调用HttpURLConnection.getResponseCode(),如果你需要写任何东西,这看起来很可疑,但在你读任何东西之前,如果你真的需要阅读任何东西,这也可能是可疑的。如果您只是执行I / O,那么您将受到映射到IOExceptions的一些HTTP状态代码的支配。