java - 如何使用java以编程方式向内部网页链接发送http请求?

标签 java html browser webserver httprequest

我正在尝试制作一个与服务器连接的java应用程序,然后尝试访问该服务器页面的链接。例如,我有一个链接“http://goodserver.com ”,我可以通过此代码连接到此网址

InetAddress addr = null;
          Socket sock = new Socket("http://goodserver.com", 80);
          addr = sock.getInetAddress();
          System.out.println("Connected to " + addr);

现在我也能够阅读该页面的整个源代码了。但有带有链接的按钮。当我通过浏览器时,我可以轻松地单击这些按钮并转到该链接。例如,名为“测试”的按钮,对应的链接为“http://goodserver.com/targets/Test”。

我想通过java访问这个链接,但问题是无法直接连接。我不想通过 java clcik 这个链接,因为我已经阅读了这个链接“Programmatically click a webpage button”。我只是想知道浏览器加载主页后访问链接的机制,但通过java http请求是不可能的。

我已通过此代码阅读了该页面

URL url = new URL("http://goodserver.com");
  BufferedReader reader = new BufferedReader
  (new InputStreamReader(url.openStream()));
  BufferedWriter writer = new BufferedWriter
  (new FileWriter("data.html"));
  String line;
  while ((line = reader.readLine()) != null) {
     System.out.println(line);
     writer.write(line);
     writer.newLine();
  }
  reader.close();
  writer.close();

当将此主页链接替换为我的目标按钮链接“http://goodserver.com/targets/Test”时,我得到的是主页源代码而不是目标页面。

我知道浏览器也会发送http请求来获取页面,那么通过java应该可以实现。提前致谢。

最佳答案

如果第二个请求的结果取决于您是否访问了主页,则您的问题可能与 cookie 有关。

HTTP 是一种无状态协议(protocol),这意味着每个请求都独立于其他请求。当您打开一个页面并单击一个按钮时,您会生成一个对该另一个 URL 的新请求,但服务器不知道您是谁或您之前打开过哪些页面。

Cookie 使服务器能够“记住”您是谁。它们的工作原理如下:当您请求页面时,服务器会将该页面的内容发送给您,但它们也可以发送一些称为cookie的额外信息。您的浏览器会存储该信息,每次您向同一服务器发出另一个请求时,浏览器都会随该请求发送 cookie。因此,即使服务器一开始不知道谁在发出请求,但现在它可以查看 cookie 并意识到它将该信息发送给了您,那么您一定是发出该请求的人.

因此,这就是您在问题中可能遗漏的部分:存储加载主页时服务器发送给您的 cookie,然后在您请求其他页面时再次发送它们,以“提醒”服务器您已经访问了主页。

当然,您可以通过解析 HTTP header 来手动完成此操作,但我强烈建议您使用一些库来为您完成此操作。 Apache HTTP Client可能是 Java 世界中最好的。以下是如何在请求之间保留 cookie 的简短示例:

public class CookiesExample {

    public static void main(String[] args) throws Exception {
        //This object will store your cookies:
        BasicCookieStore cookieStore = new BasicCookieStore();

        //Create a client using our cookie store:
        CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCookieStore(cookieStore)
                .build();

        try {
            //Execute request:
            HttpGet httpget = new HttpGet("https://example.com/");
            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                //Consume the response:
                HttpEntity entity = response.getEntity();
                EntityUtils.consume(entity);
            } finally {
                response.close();
            }

            //Whatever cookies that were sent by the server in that request 
            //are now stored in our cookie store. Subsequent requests will
            //send those cookies to the server.

            httpget = new HttpGet("https://example.com/my/awesome/internal/page");
            response = httpclient.execute(httpget);
            try {
                //Consume the response:
                HttpEntity entity = response.getEntity();
                EntityUtils.consume(entity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }
}

另一种可能的解决方案是使用一个实际的浏览器来为您处理所有这些事情。 JavaFX 有一个可以通过 Java 控制的浏览器组件,还有 Selenium,可以让您使用“驱动程序”来控制真正的浏览器(Chrome、Firefox、IE...)。

关于java - 如何使用java以编程方式向内部网页链接发送http请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002172/

相关文章:

java - Tomcat的服务器状态登录问题

java - 所有事件均不适用于 JavaFX 的 Eclipse

java - 如何获取JDBC中所有表的主键?

java - Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

javascript - 在 JS 中更改鼠标悬停时文本的颜色

html - 在 2 列文本之间 float 图像

html - 内联 SVG 与嵌入或 iframe 的性能问题

javascript - 使用javascript访问浏览器的页面缩放控件

browser - WebSocket key 如何工作?

javascript - 为特定页面设置浏览器打印机