2017-02-19 14 views
2

Я пытаюсь открыть веб-сайт своего университета, чтобы прочитать их меню. Я написал версию, которая читает меню с ссылкой на ссылку непосредственно на ссылку меню, но я хочу немного оттянуть ее, чтобы я мог читать меню с сайта, а не прямую ссылку (в случае, если ссылка когда-либо меняется) ,Не похож ли сайт на Java?

Вот URL Я открываю: https://nccudining.sodexomyway.com/dining-choices/index.html

Всякий раз, когда я открываю ссылку на веб-сайт, это выход, который я получаю:

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> 

URL, он выводит это мобильная версия веб-сайта, но когда я пытаюсь использовать этот URL-адрес, он ничего не выводит.

Это мой код:

import java.io.*; 
import java.net.*; 

public class test 
{ 
    public static void main(String[] args) 
    { 
     URL url = null; 

     try 
     { 
      url = new URL("https://nccudining.sodexomyway.com/dining-choices/index.html"); 
      HttpURLConnection test = (HttpURLConnection) url.openConnection(); 
      test.setInstanceFollowRedirects(true); 
      test.connect(); 
      System.out.println(test.getResponseCode()); 
     } catch (MalformedURLException e1) 
     { 
      System.out.println("URL cannot be opened."); 
      return; 
     } 

     BufferedReader in = null; 
     try 
     { 
      in = new BufferedReader(new InputStreamReader(url.openStream())); 
     } catch (IOException e) 
     { 
      System.out.println("Error");    
     } 
     String inputLine; 

     try 
     { 
      while ((inputLine = in.readLine()) != null) 
      { 
       System.out.println(inputLine); 
      } 
     } catch (IOException e) 
     { 
      System.out.println("Error"); 
     }  
    } 
} 

Я извиняюсь за все циклы Try/улове. Я не хочу просто бросать исключение IOException из основного с самого начала, потому что я слышал, что это плохая практика. Во всяком случае, этот код просто открывает URL-адрес, устанавливает соединение, поэтому я могу убедиться, что URL-адрес действительно существует, и попробуйте прочитать его. Он работает на любом другом сайте, на котором я его пробовал, включая google.

Мой вопрос: почему мой код не будет читать правильный исходный код веб-сайта? Это что-то не так с моим кодом (я решил добавить в 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-код, который я искал.

+0

Что такое код ответа? Если это не 301 или аналогичный, проблема на сервере: они не выдают перенаправление, поэтому Java не следует за ним. – EJP

+0

@EJP Вот что в его первом блоке кода ... –

+0

Он читает HTML-страницу веб-страницы. Прямо сейчас, он ничего не делает с тем, что он читает, так как я просто хотел, чтобы это исправлено. – ds777fighter

ответ

0

Вам просто не хватает соответствующих заголовков для связи по электронной почте, чтобы работать безопасно и надежно. Вы можете добавить несколько заголовков, чтобы убедиться, что вы получите желаемый ответ

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); 

Вместо в = новый BufferedReader (новый InputStreamReader (url.openStream()));, попробуйте in = new BufferedReader (новый InputStreamReader (test.getInputStream()));, потому что это звучит довольно логично: откройте свой InputStream от объекта HttpURLConnection. Пожалуйста, дайте мне знать, если вы все еще получаете пустую страницу. Возможно, для настройки заголовка вы получили код HTTP 200 вместо 302 :), и при попытке редактирования вы также получите html-документ. Я все еще удивляюсь проголосованию: D И это не имеет большого значения, если веб-сайт не нравится Java, потому что Java любит сайты в любом случае. Если вы действительно хотите понять часть заголовка http, попробуйте https://en.wikipedia.org/wiki/List_of_HTTP_header_fields для подробного описания заголовков http и использования

+0

Почему? В чем цель «Соединение: закрыть» здесь? и 'Принять'? и 'Accept-Charset'? и 'Accept-Language'. Простое волшебное зелье недостаточно. Вы должны * объяснить. * – EJP

+0

** Простое волшебное зелье недостаточно **, полностью согласовано, но по крайней мере он уверен, что код работает и дает точный результат? ** Вы должны объяснить **, я бы точно это сделал, как только он запустит код и вернется для объяснения ?? Потому что то, что только что оценили, было фактически проверено на точность, прежде чем я даже подумал о том, чтобы загрузить его в качестве ответа. – ShayHaned

+0

@ShayHaned. Я добавил код, как теперь показано в вопросе, и он все еще не дал мне полную страницу. – ds777fighter