3

JSoup で URL に接続できません。

私がテストしようとしている URL は www.xbox.com/en-US/security で、これはhttp://www.xbox.com/en-US/Live/Account-Securityへの 302 (だと思います) リダイレクト です。リダイレクトに従い、.headers("location") を使用して新しい URL を取得するように jsoup を設定しました。返される URL は /en-US/Live/Account-Security です。私はそれを処理する方法がわからない、私のコードは以下の通りです:

while (i < retries){
        try {
            response = Jsoup.connect(checkUrl)
                    .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                    .followRedirects(false)
                    .timeout(10000)
                    .execute();
            success = true;
            break;
        } catch (SocketTimeoutException ex){
            timeout = true;
        }  catch (MalformedURLException ep){
            malformedUrl = true;
        }catch (IOException e) {
            statusCode = 404;
        }
    }

private void getStatus(){
    if (success){
        statusCode = response.statusCode();
        success = false;
    }
    if (statusCode >= 300 && statusCode <= 399){
        //System.out.println("redirect: " +statusCode + " " +checkUrl);
        checkUrl = response.header("location");
        //System.out.println(checkUrl);
        connect();
        getStatus();
    }
}

これを処理する方法について誰か提案がありますか? または、checkUrl = response.header("location"); をチェックする必要があります。それが有効な URL であるかどうかを確認し、そうでない場合はテストしないでください。

4

1 に答える 1

6

まず最初に、「www.xbox.com/en-US/security」にアクセスしようとすると、MalformedException がスローされ、目的の場所にリダイレクトされません。

ブール変数の成功のみを使用し、例外がキャッチされた場合は false に設定するという問題があります。繰り返しますが、タイムアウトを使用しているか、不正な変数を使用しているかはわかりません。

その後、IOException の直後の行は役に立たないと思います。完全なコードが表示されないため、これもわかりませんでした。

今... あなたの質問に: 返された文字列は、最初に指定した URL 内のドメインです。それは次のように簡単に進みます:

//Assuming you won't ever change it, make it a final
//variable for less memory usage.
final String URL = "http://www.xbox.com/en-US/security";

//Whatever piece of processing here

//Some tests just to make sure you'll get what you're
//fetching:
String newUrl = ""
if (checkUrl.startsWith("/"))
    newUrl = URL + checkUrl;

if (checkUrl.startsWith("http://"))
    newUrl = checkUrl;

if (checkUrl.startsWith("www"))
    newUrl = "http://" + checkUrl;

このコードは基本的に、MalformedUrlException を取得することなく、URL をナビゲートできるようにします。manageUrl() メソッドをどこかに置いて、取得した URL が検索しているドメイン内にあるかどうかをテストすることをお勧めします。

それが役立つことを願っています=)

于 2012-05-16T18:02:21.310 に答える