2011-12-28 4 views
1

Я пытаюсь извлечь источник веб-сайта, и я исследовал немного, и многие решения указывают на использование HTTPClient и HTTPContext, но проблема в том, что я не могу использовать URL-адрес для получения этого источника. Веб-сайт, который я использую, основан на логинах и независимо от того, с кем вы вошли в систему, он отображает один и тот же URL (но, конечно, информация, которую нужно извлечь, отличается от пользователя). Поэтому мне было интересно, есть ли способ напрямую получить источник, возможно, веб-просмотр или что-то в этом роде. Таким образом, я не могу использовать промежуточное URL-адрес, потому что он является однородным и в основном перенаправляется на общую страницу входа в систему.Android: Извлечение html-источника

Извините, если у меня что-то не хватает; Я новичок в этом. Благодарим вас за помощь заранее.

EDIT:

Я нашел дифференцированный URL, который отличается для каждого пользователя, но есть (ругой), связанные с проблемой: Использование jsoup, я могу сделать Jsoup.connect (» . http://www.stackoverflow.com/ ") .get() HTML(); (с URL-адресом, замененным на то, что я пытаюсь получить), и на самом деле он получает источник HTML, но проблема снова возникает, что он запрашивает входную информацию, когда я пытаюсь получить доступ к веб-сайту, защищенному паролем/паролем. Мне нужно иметь возможность вводить имя пользователя и пароль один раз и в основном хранить это в какой-то временной вещи (файлы cookie/cache?) И сохранять эту информацию для jsoup, чтобы прекратить запрашивать учетные данные для входа каждый раз, когда я запрашиваю источник на основе определенного URL. Я до сих пор не могу найти способ, чтобы обойти это ...

ответ

1

Ну, если я правильно понял (дайте мне знать, если я не сделал):

Если пользователь/защищен паролем вы должны выдать HTTP POST (т.е. это то, что вы делаете из браузера, например) и получить ответ от этого сообщения? Что-то вроде этого:

http://www.informit.com/guides/content.aspx?g=java&seqNum=44

EDIT: Вот пример

У меня есть страница, которая выглядит следующим образом (это упрощенно, но тем не менее здесь):

<form action="../../j_spring_security_check" method="post" > 
     <input id="j_username" name="j_username" type="text" /> 
      <input id="j_password" name="j_password" type="password"/> 
        <input type="image" class="submit" id="login" name="login" /> 
</form> 

Если это где-то веб-страница, вам необходимо указать имя пользователя/пароль, чтобы получить фактический контент «после» этой страницы входа. То, что вы действительно выпускаете, это HTTP POST здесь (я уверен, что в вашем случае это то же самое).

Теперь, чтобы получить такую ​​же функциональность в программном пути ...

Вам потребуются апачская библиотека HTTP клиента (вы, вероятно, можете обойтись и без него, но это легкий путь). Вот для него зависимость maven. вы идете это для Android, не так ли? Apache http client по умолчанию используется в Android от того, что я прочитал.

<dependency> 
<groupId>commons-httpclient</groupId> 
<artifactId>commons-httpclient</artifactId> 
<version>3.1</version> 

import org.apache.commons.httpclient.Header; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.methods.GetMethod; 
import org.apache.commons.httpclient.methods.PostMethod; 

public class HttpPost { 
    public static void main(String[] args) { 

     HttpClient httpClient = new HttpClient(); 
     PostMethod postMethod = new PostMethod("http://localhost:20000/moika/moika/j_spring_security_check"); 
     postMethod.addParameter("j_username", "ACTUAL_USER"); 
     postMethod.addParameter("j_password", "ACTUAL_PASSWORD"); 

     try { 
      int status = httpClient.executeMethod(postMethod); 
      System.out.println("STATUS-->" + status); 

      if(status == 302){ 
       Header header = postMethod.getResponseHeader("location"); 
       String location = header.getValue(); 
       System.out.println("HEADER_VALUE-->" + location); 
       GetMethod getMethod = new GetMethod(location); 
       httpClient.executeMethod(getMethod); 
       String content = getMethod.getResponseBodyAsString(); 
       System.out.println("CONTENT-->" + content); 
      } 

      String contentInCaseOfNoRedirect = postMethod.getResponseBodyAsString(); 

     } catch (Exception exception){ 
      exception.printStackTrace(); 
     } 
    } 
} 

Это может выглядеть странно немного, но я выполняю редирект (302), кажется, есть проблема с этим в ОКВ, таким образом, небольшая работа вокруг.

Если вы не выполняете перенаправления на стороне сервера, вы можете игнорировать часть, где я проверяю 302.

Посмотрите, что подходит для вас.

Cheers, Eugene.

+0

Ваш метод кажется на правильном пути, но меня смущает. Возможно ли, чтобы вы предоставили некоторый пример кода о том, как получить html-источник веб-сайта, учитывая ситуацию? – Kgrover

+0

Отредактирован ответ. Eugene – Eugene

+0

Я буду экспериментировать с ним и дам вам знать. Спасибо за ответ! – Kgrover

0

см http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html

или проверить образец кода

Как читать содержимое URL

try{ 
     URL oracle = new URL("http://www.w3schools.com/html/html_tables.asp"); 
     URLConnection yc = oracle.openConnection(); 
     InputStream is = yc.getInputStream(); 
     String inputLine; 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(
       yc.getInputStream())); 
     while ((inputLine = in.readLine()) != null) 
      System.out.println(inputLine); 
     in.close(); 

     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
+0

Я мог бы быть медленным из-за утреннего настроения, но как вы решили эту часть в ответе: «он отображает один и тот же URL (но, конечно, информация, которую нужно извлечь, зависит от пользователя». представленный, просто читает содержимое URL-адреса, ИМХО, вы вообще не ответили на вопрос – Eugene

+0

Да, Евгений, я полностью согласен. Я знаю, как читать содержимое простого URL-адреса, но ситуация здесь другая. – Kgrover

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