这个网站不喜欢Java吗?

这个网站不喜欢Java吗?,java,url,Java,Url,我正试图打开我大学的网站来阅读他们的菜单。我已经写了一个版本,可以直接读取菜单链接的菜单,但是我想把它向后拉一点,这样我就可以从网站而不是直接链接读取菜单(以防链接发生变化) 以下是我正在打开的URL: 每当我打开网站链接时,我都会得到以下输出: 302 <html><head><title>Object moved</title></head><body> <h2>Object moved to <a

我正试图打开我大学的网站来阅读他们的菜单。我已经写了一个版本,可以直接读取菜单链接的菜单,但是我想把它向后拉一点,这样我就可以从网站而不是直接链接读取菜单(以防链接发生变化)

以下是我正在打开的URL:

每当我打开网站链接时,我都会得到以下输出:

302
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="http://m-nccudining.sodexomyway.com/dining-choices/index.html">here</a>.</h2>
</body></html>
我为所有的try/catch循环道歉。我不想一开始就从main抛出IOException,因为我听说这是一种糟糕的做法。无论如何,这段代码只是打开URL,建立连接,这样我就可以确保URL确实存在,并尝试读取它的HTML。它适用于我尝试过的任何其他网站,包括谷歌

我的问题是为什么我的代码不能读取网站的正确源代码?我的代码有什么问题吗(我想添加HttpsURLConnection并允许重定向会起作用),还是只是网站的问题,除了打开每周菜单的页面,我还能做些什么来绕过这个问题

找到解决方案感谢@ShayHaned的修复。我在HttpURLConnection中添加了以下几行,因此得到了200响应代码,而不是302响应代码:

        test = (HttpURLConnection) url.openConnection();
        test.setRequestMethod("GET");
        test.setRequestProperty("User-Agent", "Mozilla/5.0");
        test.setInstanceFollowRedirects(true);
然后,我将InputStream从从URL打开流更改为从HttpURLConnection获取输入流,如图所示:

BufferedReader in = new BufferedReader(new InputStreamReader(test.getInputStream()));

这给了我想要的HTML。

您只是缺少了http通信安全工作的适当头。您可以添加几个标题以确保获得所需的响应

    HttpURLConnection test = (HttpURLConnection) url.openConnection();
    test.addRequestProperty( "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" );
    test.addRequestProperty( "Accept" , "text/html,application/xhtml+xml,application/xml,image/png, image/svg+xml,;q=0.9,*/*;q=0.8");
    test.addRequestProperty( "Accept-Charset" , "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
    test.addRequestProperty( "Accept-Language" , "en-US,en;q=0.8" );
    test.addRequestProperty( "Connection" , "close" );
    test.setRequestMethod("GET");


    test.setInstanceFollowRedirects(true);
    test.connect();

    // Nopes DONT TRY THIS
    //in = new BufferedReader(new InputStreamReader(url.openStream()));

    in = new BufferedReader( new InputStreamReader( test.getInputStream() ) );      
    String htmlContent = "";
    for( String inputLine = ""; ( inputLine = in.readLine() ) != null; )
        htmlContent += inputLine;
    System.out.println( htmlContent );

而不是in=new BufferedReader(新的InputStreamReader(url.openStream()),请在=new BufferedReader(new InputStreamReader(test.getInputStream())中尝试,因为从实际的HttpURLConnection对象打开InputStream听起来非常合乎逻辑。请让我知道,如果你仍然得到一个空白页。标题调整可能会让您得到HTTP 200代码,而不是302:),在尝试编辑时,您也会得到html文档。我仍然对否决票感到惊讶:D,如果网站不喜欢Java,这其实并不重要,因为Java喜欢网站。如果您确实想了解http头部分,请尝试详细描述http头和用法

响应代码是什么?如果不是301或类似的,问题就出在服务器端:他们没有发出重定向,所以Java没有遵循重定向。@EJP这是他的第一个代码块中的内容……它读取网页的HTML。现在,它对它读到的内容没有任何作用,因为我只是想修复它。该网站可能会检查用户代理头(),并以某种方式决定由Java发送的头(或者如果Java没有发送任何头,则不存在该头)应该将其重定向到移动网站。只需发送一个众所周知的桌面Web浏览器的用户代理头。如果你认为从主方法扔代码> IOExtExo/<代码>是不好的做法,那么你所做的就更糟了…当你只看到“错误”时,你会发现什么是错误的。在您的情况下,只需抛出它,或者至少对异常调用
printStackTrace()
。为什么?
连接的目的是什么:在此处关闭
?和
接受
?和
接受字符集
?和
接受语言
。仅仅一剂魔药是不够的。你必须解释。完全同意,仅仅一剂魔药是不够的,但他至少可以确保代码正在运行并给出准确的结果??你必须解释,我当然会,一旦他运行代码并回来解释??因为在我把它作为一个文件上传之前,刚刚被降级的东西实际上已经被测试过准确性了answer@ShayHaned我添加了代码,如问题中所示,但仍然没有给出完整的页面。我不确定完整的页面,但如果我试图打开我的大学网站阅读他们的菜单,然后在应用了解决方案之后,我得到了html文本文档和您提到的完整菜单内容,但是由于我无法查看您得到的html页面,那么我们肯定会面临死锁,那么您使用的是我在问题中发布的链接,还是专门针对菜单的链接?我可以阅读菜单的链接,它包含了我遇到麻烦的菜单链接。
    HttpURLConnection test = (HttpURLConnection) url.openConnection();
    test.addRequestProperty( "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" );
    test.addRequestProperty( "Accept" , "text/html,application/xhtml+xml,application/xml,image/png, image/svg+xml,;q=0.9,*/*;q=0.8");
    test.addRequestProperty( "Accept-Charset" , "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
    test.addRequestProperty( "Accept-Language" , "en-US,en;q=0.8" );
    test.addRequestProperty( "Connection" , "close" );
    test.setRequestMethod("GET");


    test.setInstanceFollowRedirects(true);
    test.connect();

    // Nopes DONT TRY THIS
    //in = new BufferedReader(new InputStreamReader(url.openStream()));

    in = new BufferedReader( new InputStreamReader( test.getInputStream() ) );      
    String htmlContent = "";
    for( String inputLine = ""; ( inputLine = in.readLine() ) != null; )
        htmlContent += inputLine;
    System.out.println( htmlContent );