Я прошел через различные учебники и этот сайт, но не смог найти правильное решение. С другой стороны, я видел, как приложения регистрировались на веб-сайтах и запрашивали дополнительную информацию, поэтому я уверен, что есть способ заставить это работать, но, возможно, мой подход ошибочен.
Вот то, что я пытаюсь сделать: я хочу войти на веб-сайт, для которого требуется аутентификация пользователя, а затем читать и анализировать веб-сайты, доступные только в том случае, если пользователь вошел в систему. Проблема: после того, как POSTing учетные данные на веб-сайт, я получаю файл cookie, который, похоже, не сохраняется в моем HttpClient, даже если документы предполагают, что это должно произойти.
Вот некоторые из моих кодов:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(LOGIN_URL);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair(USER_FIELD, login));
nvps.add(new BasicNameValuePair(PASS_FIELD, pw));
nvps.add(new BasicNameValuePair(REMEMBERME, "on"));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
if (entity != null) {
entity.consumeContent();
}
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
Когда я вывожу содержимое "cookies", все кажется прекрасным (я получаю сеанс):
- [version: 0][name: ASP.NET_SessionId][value: xxx][domain: xxx][path: /][expiry: null]
Как я понял, cookie/session будет сохранен и использован в моем HttpClient, пока я его не закрываю.
При чтении следующей страницы (которая ограничена), используя этот код:
HttpGet httpget2 = new HttpGet(RESTRICTED_URL);
response = httpclient.execute(httpget2);
entity = response.getEntity();
InputStream data = entity.getContent();
// data will be parsed here
if (entity != null) {
entity.consumeContent();
}
// connection will be closed afterwards
Если я выхожу ответ GET-запроса (используя response.getStatusLine()
), я получаю сообщение "200 OK", но разбор сайта, который возвращается, показывает, что логин потерян (я получаю только форму для входа).
Любая помощь приветствуется.