2012-05-16 4 views
1

У меня возникли проблемы с подключением к URL-адресу с JSoup.Jsoup malformed url

URL-адрес, который я пытаюсь проверить, - www.xbox.com/en-US/security, который является 302 (я думаю) перенаправлением на http://www.xbox.com/en-US/Live/Account-Security. Я настроил jsoup, чтобы выполнить перенаправление и получить новый url, используя .headers («location»). Возвращаемый 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-адресом и если он не проверяет его?

ответ

3

Прежде всего: если вы попытаетесь получить доступ к «www.xbox.com/en-US/security», он выкинет вам исключение MalformedException и, таким образом, не перенаправит вас туда, где вы хотите.

Чем выше проблема, тем я буду использовать только переменную boolean variable и установить ее как 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. Я хотел бы предложить метод manageUrl() где-нибудь и проверить, находится ли выбранный URL в домене, который вы ищете, или вы можете оказаться на сайтах электронной коммерции или публичных объявлений.

Надеюсь, он поможет =)

+0

Спасибо за это, вы можете просто объяснить один бит. Я немного смущен. В первой проверке вы измените URL-адрес на «newUrl = checkUrl + URL;» это не даст мне что-то вроде: «/live/account-securityhttp://www.xbox.com/en-US/security». Мне нужно выяснить, что такое базовый url и присоединиться к нему с помощью checkUrl? – Peck3277

+0

Ха-ха. Виноват. Он должен быть URL + checkUrl. Просто отредактировал его. Но да. Это точно. Вы должны найти так называемый канонический url. который всегда похож на «http://www.mainpage.com/» или «http://www.mainpage.com/mainsession». (Если вы перемещаетесь по hrefs, вы обнаружите, что на многих сайтах вы не перенаправлены на полную страницу, а на часть ее, которая позже будет объединена с этим каноническим url. –

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