Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

URLConnectionクラスのgetInputStream()に与える引数について

掲題の通り、URLConnectionクラスのgetInputStream()に与える引数について質問があります。
getInputStream()関数に与える引数はWEBサイトのURLだと認識していますが、
なにかURL文字列やURL先のhtmlなどに制約はあるのでしょうか?

現在プログラム作成しているのですが、下記のような引数を与えるとエラーを出力せずハングしてしまいます
・http://sasakiatsushi.tumblr.com/post/140622787753/
ただ、別のURL(https://www.google.co.jp/)だと処理が成功します。
どこに問題があるのでしょうか。。


参考として、一連の処理を載せておきます。
public String getHtml(String input_url) throws IOException {
        URL url = null;
        URLConnection urlConnection = null;
        try {
            url = new URL(input_url);
            //url = new URL("http://sasakiatsushi.tumblr.com/post/140622787753/"); ←ハングする
                        //url = new URL("https://www.google.co.jp/"); ←成功する
            urlConnection = url.openConnection();
            urlConnection.setConnectTimeout(100000);
            urlConnection.setReadTimeout(100000);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        InputStream in = urlConnection.getInputStream();
        StringBuilder sb = new StringBuilder();
        BufferedReader bf =null;
        String s=null;
        try {
            bf = new BufferedReader(new InputStreamReader(in));
            while ((s=bf.readLine())!=null) {
                System.out.println("sb.append");
                sb.append(s);
            }
            bf.close();
            in.close();
            in =null;
        } finally {
        }
        return sb.toString();
    }

よろしくお願いいたします。

2

回答

3980

閲覧

2件の回答

評価

0

タイトルで「引数?何の話だ?」と思ったら、やはり間違ってるな。
URLクラスのコンストラクタ引数がどういうものかは、JavaDocを読むだけでも分かるはずだ。

>ハングしてしまいます
ハングするわけない。stacktraceをちゃんと読んでいないだけ。
stacktraceには問題を解消するための情報が出力される。
製造者はそれを見ずに諦めてはいけないし、そうしているうちはいつまで経っても初心者だ。

ただ、今回はそれ以前の話になる。

> throws IOException {
メソッド内で発生する例外全てに責任を持つこと。
どこでどういうときにどんな例外が発生するのか。そのうちどれをメソッド内で吸収し、残りを上位に伝えるのか。
「こうしたらコンパイルエラーがなくなった」だけではないか?
「コンパイルエラーがない」=「正しいプログラム」ではない。

try~finallyも適当に書いているようだ。
これも動作させる以前の話だ。

評価

0

http://www.javadrive.jp/servlet/dispatch/index4.html
フォワードの場合は呼び出したサーブレットが、サーバ内部で別のサーブレットなどに処理をそのまま移す為、
クライアント側では処理が移ったことを把握できません。リダイレクトの場合にはサーバがクライアントに
別のURLを見に行くように指示するだけなので、クライアントはリダイレクト先のURLを自分で見に行ったかの
ような挙動をするわけです。 


http://www.atmarkit.co.jp/ait/articles/0407/13/news100.html
独自のエラーページを指定

http://digital-marketing.jp/site-structure-404-error-page
リダイレクトで全てTOPページに転送する

http://android.sukimash.com/network/urlconnection-redirect-download/
リダイレクトされているような場合だと、inputStream からデータを読み込むことができません。
 なぜ読めないか(読めないようにしているか)というと、セキュリティの問題らしい。

http://d.hatena.ne.jp/nowokay/20110409
短縮URLなんかのリダイレクト先を取得するコード


http://okwave.jp/qa/q8377395.html
途中でリダイレクトされてるとか、隠しパラメータとか、cookieとかをつけ忘れてるとか
自動ログインしようとする人に対する対策か

import java.net.URL;
import java.net.*; 
import java.io.*; 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;


public class J{

public static void main(String[] args){

        URL url = null;
 
 HttpURLConnection urlConnection = null;

        try {
           // url = new URL(input_url);
url = new URL("http://sasakiatsushi.tumblr.com/post/140622787753/");

     //                  url = new URL("https://www.google.co.jp/");// ←成功する


  urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setInstanceFollowRedirects(true);trueならリダイレクトを認める



        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException  e) {
            e.printStackTrace();
        

}
InputStream in=null;

 try {

        in = urlConnection.getInputStream();

  }
 catch (IOException  e) {


e.printStackTrace();


}
        StringBuilder sb = new StringBuilder();
        BufferedReader bf =null;
        String s=null;
        try {
            bf = new BufferedReader(new InputStreamReader(in));
            while ((s=bf.readLine())!=null) {
                System.out.println(s);
                sb.append(s);
            }
            bf.close();
            in.close();
            in =null;
        }
 catch (IOException  e) {
            e.printStackTrace();
        

}

 finally {
        }
        //return; sb.toString();
    }

}



以上のようにコードを書き換えて実行すると
http://sasakiatsushi.tumblr.com/post/140622787753/
を読み込もうとした時
urlConnection.setInstanceFollowRedirects(true);trueならリダイレクトを認める
がtrueの時はエラーでstacktraceが出る

一方、falseの時はエラーは出ず何も表示されない


falseにすると何も表示されないということは
リダイレクトしているということ

falseにしてリダイレクトを認めないようにするとエラーが出なくなったというのなら
これまでリダイレクトしていた事がエラーの原因だったということ

https://www.google.co.jp/については
true,falseいずれにしても読み込みに成功する

リダイレクトされるURLであっても読み込めるようなコードに書き換えなければ読み込めないのではないか?

http://android.sukimash.com/network/urlconnection-redirect-download/
リダイレクトされているような場合だと、inputStream からデータを読み込むことができません。
 なぜ読めないか(読めないようにしているか)というと、セキュリティの問題らしい。

もし仮に本当にセキュリティの問題で恣意的に「読み込めないようにして」あり
そのせいで今回読めなかったのだとすると


どこに問題が~

部分に対する答えは

書いたコードに問題があるのではなく、リダイレクトする場合にはプログラム経由では読んでほしくない誰かが
その場合はinputStreamでは読めないように作っているので、
無理に読もうとする行為は、セキュリティをかけて読ませないようにしている
誰かの意図に逆行する行動なのでよくない


ということになります。


質問から6ヶ月以上経過しているので、回答を書き込むことはできません。