Android: извлечение HTML-источника - PullRequest
1 голос
/ 28 декабря 2011

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

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

РЕДАКТИРОВАТЬ :

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

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Хорошо, если я правильно понял (дайте мне знать, если я этого не сделал):

Если это защищено пользователем / паролем, следует ли вам опубликовать Http-пост (это то, что вы делаете из браузера, например) и получитьОтвет с этого поста?Примерно так:

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

РЕДАКТИРОВАТЬ: Вот пример

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

<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 здесь (держу пари, что в вашем случае он такой же).

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

Вам понадобится apacheклиентская библиотека http (вы могли бы обойтись без нее, но это самый простой способ).Вот maven зависимость для этого.Вы собираетесь это для Android, верно?Apache http клиент по умолчанию в 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), кажется, есть проблема с этим в RCF, поэтому небольшая работаоколо.

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

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

Ура, Евгений.

0 голосов
/ 28 декабря 2011

см. 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...