2016-09-13 4 views
0

При открытии соединения, как я могу узнать лучший формат URL для использования?При использовании URL.openConnection() лучший способ обработки URL-адресов, таких как «www» и «https»?

Многие сайты возвращают разные результаты в зависимости от того, использует ли URL «www» и/или «https».

Например, вот тест, который я написал, чтобы увидеть некоторые из различных результатов:

import java.util.Scanner; 
import java.util.ArrayList; 
import java.net.*; 
import java.io.*; 

public class Test { 

    public static void main(String[] args) 
    { 
     String baseURL = "google.com"; 

     try 
     { 
     java.net.URL url = new java.net.URL("http://" + baseURL); 
     java.net.URLConnection connection = url.openConnection(); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line; 
     int lineCount = 0; 

     while ((line = in.readLine()) != null) 
     { 
      lineCount++; 
     } 

     System.out.println("http://" + baseURL + " = " + lineCount + " lines"); 
     } 

     catch (Exception ex) 
     { 
     System.out.println("http://" + baseURL + " throws an error"); 
     } 



     try 
     { 
     java.net.URL url = new java.net.URL("http://www." + baseURL); 
     java.net.URLConnection connection = url.openConnection(); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line; 
     int lineCount = 0; 

     while ((line = in.readLine()) != null) 
     { 
      lineCount++; 
     } 

     System.out.println("http://www." + baseURL + " = " + lineCount + " lines"); 
     } 

     catch(Exception ex) 
     { 
     System.out.println("http://www." + baseURL + " throws an error"); 
     } 







     try 
     { 
     java.net.URL url = new java.net.URL("https://" + baseURL); 
     java.net.URLConnection connection = url.openConnection(); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line; 
     int lineCount = 0; 

     while ((line = in.readLine()) != null) 
     { 
      lineCount++; 
     } 

     System.out.println("https://" + baseURL + " = " + lineCount + " lines"); 
     } 

     catch (Exception ex) 
     { 
     System.out.println("https://" + baseURL + " throws an error"); 
     } 



     try 
     { 
     java.net.URL url = new java.net.URL("https://www." + baseURL); 
     java.net.URLConnection connection = url.openConnection(); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line; 
     int lineCount = 0; 

     while ((line = in.readLine()) != null) 
     { 
      lineCount++; 
     } 

     System.out.println("https://www." + baseURL + " = " + lineCount + " lines"); 
     } 

     catch (Exception ex) 
     { 
     System.out.println("https://www." + baseURL + " throws an error"); 
     } 
    } 
} 

Здесь были результаты работы его на четырех различных веб-сайтах:

http://stackoverflow.com = 4205 lines 
http://www.stackoverflow.com = 4205 lines 
https://stackoverflow.com = 4205 lines 
https://www.stackoverflow.com = 2 lines 

 

http://qvc.com = 2438 lines 
http://www.qvc.com = 2438 lines 
https://qvc.com throws an error 
https://www.qvc.com = 0 lines 

 

http://facebook.com = 0 lines 
http://www.facebook.com = 0 lines 
https://facebook.com = 25 lines 
https://www.facebook.com = 25 lines 

 

http://google.com = 6 lines 
http://www.google.com = 6 lines 
https://google.com = 343 lines 
https://www.google.com = 343 lines 

Учитывая базовый URL, как «google.com», что правильный способ проверки, чтобы увидеть, какой формат следует использовать для веб-сайта?

+0

Предположительно, ответ на http является перенаправлением на защищенный протокол https. –

+0

проверьте код ответа. если вы получите перенаправление, то вы, вероятно, использовали неправильный формат. например 'www.stackoverflow.com' выдает 301 переадресацию только на' stackoverflow.com'. –

+0

@MarcB - Да, я подумал, что это будет что-то вроде этого. Можете ли вы опубликовать его в качестве ответа? – Pikamander2

ответ

0

После прочтения ответа Марка Б, несколько других потоков StackOverflow (которые я связывал в комментариях оригинальный вопрос в), и this guide, вот что я придумал:

String baseURL = "google.com"; 

try 
{ 
    java.net.URL url = new java.net.URL("http://" + baseURL); 
    java.net.HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); 

    int response = connection.getResponseCode(); 
    System.out.println("Response code: " + response); 

    if (response == 301 || response == 302 || response == 303) 
    { 
      System.out.println("Redirect location: " + connection.getHeaderField("Location")); 
    } 

    else 
    { 
      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

      String line; 
      int lineCount = 0; 

      while ((line = in.readLine()) != null) 
      { 
      lineCount++; 
      } 

      System.out.println("http://" + baseURL + " = " + lineCount + " lines\n"); 
    } 
} 

catch (Exception ex) 
{ 
    System.out.println("http://" + baseURL + " throws an error\n"); 
} 

, который выводит это:

Response code: 302 
Redirect location: https://www.google.com/?gws_rd=ssl 

Вы также можете использовать HttpURLConnection.HTTP_MOVED_TEMP, HttpURLConnection.HTTP_MOVED_PERM и HttpURLConnection.HTTP_SEE_OTHER вместо числовых кодов ответа. На самом деле это, вероятно, лучшая практика.

1

Проверьте код ответа HTTP. Если вы получаете перенаправление, то вы, вероятно, использовали неправильный формат. например http://www.stackoverflow.com сделает 301 переадресацию только http://stackoverflow.com.

+1

Разве нет способа рассказать о запросе на переадресацию? –

+0

Наверное, но я не делаю java, поэтому не знаю, какой вариант это будет. –

+0

'Нет ли способа сообщить запрос о переадресации? 'Переведите URLConnection на [HttpURLConnect] (https://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection. html) и вызов 'setFollowRedirects (true);' – copeg

 Смежные вопросы

  • Нет связанных вопросов^_^