【问题标题】:How to get correct HTTP response in JAVA?如何在 JAVA 中获得正确的 HTTP 响应?
【发布时间】:2012-08-15 23:07:38
【问题描述】:

我想在网页上获取一些数据,所以我使用 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方法),搜索结果仍然显示。

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

但我不知道如何使用 JAVA 实现相同的会话,有什么例子吗?

【问题讨论】:

  • 你期望得到什么样的回应,你实际得到什么样的回应?
  • 尝试使用conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2") 之类的内容正确设置请求标头。 asp 页面可能在用户代理字符串或 cookie 上。
  • 是空白响应还是抛出异常?
  • 我测试了setrequestproperty,结果一样,我认为这不是用户代理,因为我有新发现,我将编辑我的问题帖子

标签: java sockets httpresponse urlconnection


【解决方案1】:

如果您没有在请求中发送任何内容,请评论以下行:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我检查了所提供 URL 的源代码。它在 HTML 标记中有一些错误。这可能是在某些浏览器中未提交表单的原因。这取决于您的浏览器对不良标记的宽容程度。例如元素定义在 /tr 和 tr 元素之间,这意味着在一个表中:

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

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

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

        【讨论】:

        【解决方案5】:

        在你写完之后调用HttpURLConnection.getResponseCode(),如果你需要写任何东西,这看起来很可疑,但是在你读之前,如果你真的需要读任何东西,这也可能是可疑的。如果你只是做 I/O,你会受到一些 HTTP 状态码被映射到 IOExceptions 的摆布。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-19
          • 2018-09-09
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          • 2015-01-03
          • 2017-07-19
          相关资源
          最近更新 更多