2016-09-11 15 views
0

私は以下のコードを使用してウェブページのコンテンツを読み込もうとしています。しかし、期待どおりにWebコンテンツは印刷されません。 IDEにエラーは表示されません。そして、例外はありません。プロキシも設定されていません。なぜそれが動作しないかもしれないのか案内してくれますか?ウェブページのコンテンツを読み取ることができません

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

public class URLReader { 
    public static void main(String[] args) throws Exception { 

     URL oracle = new URL("http://www.oracle.com/"); 
     BufferedReader in = new BufferedReader(
     new InputStreamReader(oracle.openStream())); 

     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      System.out.println(inputLine); 
     in.close(); 
    } 

ループはデバッグ中にループしません。しかし、バッファリーダーobjにはJavaオブジェクトが表示されます

答えて

1

URL http://www.oracle.com/はHTTPS URLではないため、Webサイトのコンテンツを印刷しようとすると出力が表示されません。 https://www.oracle.com/

+0

悲しいことに、この例では、Oracle自体からだったし、彼らは考慮することを取ったことはありません。 – Maxs728

+0

デフォルトでは、この場合のように、 'HttpURLConnection'は、Oracleが' https:// www.oracle.com'に発行するリダイレクトに従います。 – EJP

+0

それは本当です...これは、Oracleがリダイレクトを処理する方法に基づいて動作しないケースに過ぎないと思います。 –

0

受け入れられた回答(およびコメント)は、実際に何が起こっているのか、プログラムがなぜそうでないのかを実際には説明しません。

まず、お気に入りのウェブブラウザでURL http://www.oracle.com/を開きます。 URLバーにURL https://www.oracle.com/index.htmlがどのように実際に結びついているかに注目してください。何が起こったのは、http://www.oracle.com/のWebサーバーがブラウザを新しいURLにリダイレクトしたことです。

サーバーがリダイレクトすると、ブラウザが行うGET要求に何らかのリダイレクト応答(ステータスコード3xx)が送信されます。ブラウザはリダイレクト応答を読み取り、リダイレクトのターゲットURLを抽出してから、GET要求をターゲットURLに再送信します。 (これは繰り返すことができます....)

あなたの例で起こっていることは、あなたのコードがリダイレクトを尊重していないということです。代わりに、3xx応答を通常の応答として扱うだけです。あなたのコードは応答の "本体"を読み込みます。これは空です。

URLを実際のターゲット(または同等のもの)に手動で変更すると、リダイレクト....の必要性が回避され、コードが機能します。コードでリダイレクトを処理できるようにするには、別の方法で記述する必要があります。

ただし、この場合はHttpUrlConnectionを使用するには十分ではありません。「リダイレクトに従う」オプションをオンにするだけです。 Java HTTPスタックは、異なるプロトコル(HTTPからHTTPSなど)へのリダイレクトをフォローしません。このQ & Aを参照してください。

関連する問題