Intereting Posts
Как позволить ImageView и TextView одинаковой высоты NullPointerException при использовании RelativeLayout как пользовательский InfoWindow Android – установить все предупреждения lint как ошибки, за исключением определенных Отладка приложений Android для разжигания огня Результат литья при умножении двух положительных целых чисел в long – отрицательное значение Ошибка: пакет javax.annotation не существует после обновления до lombok 1.16.2 Почему эта ошибка '- приложение только для чтения не может POST' Android: Невозможно получить данные изображения RAW с камеры? Доступ к приложениям Android (для людей с ограниченными возможностями) с помощью PhoneGap Импорт SDK в Facebook для Eclipse не может разрешить импорт java / Android Использование windowTranslucentStatus со скрытой панелью инструментов Android Google Service Place picker setLatLngBounds () не работает Просмотр обоев вокруг другого вида Почему функция MediaRecorder не вызывает ошибку ANR? Как определить взаимодействие пользователя любого типа?

Проблемы с передачей файлов cookie для запроса GET (после POST)

Я застрял в этом вопросе уже несколько дней, мои глаза начинают болеть от времени, потраченного на различные комбинации, но безуспешно. Дело в том, что я делаю приложение, которое должно получить данные из Интернета, проанализировать его и затем показать его пользователю. Я пробовал несколько методов для этого, и использование JSOUP было очень полезно, особенно при разборе и получении данных из результатов.

Однако есть одна проблема, которую я не могу решить. Я попытался с помощью обычного HTTPClient и с JSOUP, но я не могу успешно получить нужные мне данные. Вот мой код (версия JSOUP):

public void bht_ht(Context c, int pozivni, int broj) throws IOException { //this is the first connection, to get the cookies (I have tried the version without this method separate, but it's the same Connection.Response resCookie = Jsoup.connect("http://www.bhtelecom.ba/imenik_telefon.html") .method(Method.GET) .execute(); String sessionId = resCookie.cookie("PHPSESSID"); String fetypo = resCookie.cookie("fe_typo_user"); //these two above are the cookies //the POST request, with the data asked Connection.Response res = Jsoup.connect("http://www.bhtelecom.ba/imenik_telefon.html?a=search") .data("di", some_data) .data("br", some_data) .data("btnSearch","Tra%C5%BEi") .cookie("PHPSESSID", sessionId) .cookie("fe_typo_user", fetypo) .method(Method.POST) .execute(); Document dok = res.parse(); //So, here is the GET request for the site which contains the results, and this site is redirected to with HTTP 302 response after the POSt result Document doc = Jsoup.connect("http://www.bhtelecom.ba/index.php?id=3226&") .cookie("PHPSESSID", sessionId) .cookie("fe_typo_user", fetypo) .referrer("http://www.bhtelecom.ba/imenik_telefon.html") .get(); Document doc = res2.parse(); Element elemenat = doc.select("div.boxtexter").get(0); String ime = elemenat.text(); } 

Таким образом, конечным результатом будет строка, содержащая возвращенные данные. Но, что бы я ни пытался, я получаю «пустую» страницу и анализируемый текст, и я смоделировал все, что запрашивается браузером.

Вот POST и GET исходные заголовки, захваченные браузером: (post)

 > POST /imenik_telefon.html?a=search HTTP/1.1 Host: www.bhtelecom.ba > Content-Length: 56 Cache-Control: max-age=0 Origin: > http://www.bhtelecom.ba User-Agent: Mozilla/5.0 (Windows NT 6.1; > WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 > Safari/535.1 Content-Type: application/x-www-form-urlencoded Accept: > text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding: > gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: > ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: > PHPSESSID=opavncj3317uidbt93t9bie980; > fe_typo_user=332a76d0b1d4944bdbbcd28d63d62d75; > __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) > > di=033&br=123456&_uqid=&_cdt=&_hsh=&btnSearch=Tra%C5%BEi 

(получить)

 > GET /index.php?id=3226& HTTP/1.1 Host: www.bhtelecom.ba Cache-Control: > max-age=0 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) > AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1 > Accept: > text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding: > gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: > ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: > PHPSESSID=opavncj3317uidbt93t9bie980; > __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); fe_typo_user=07745dd2a36a23c64c2297026061a2c2 

В этом GET (его ответе) мне нужны данные, но с любой комбинацией параметров, файлов cookie или всего, что я пробовал, я не мог заставить его «думать», что я сделал POST, и теперь хочу, чтобы эти данные ,

Вот версия моего кода без парсера JSOUP, но я не могу заставить его работать, хотя, когда я проверяю эти файлы cookie, они в порядке, одинаковые для POST и GET, но безуспешно.

 DefaultHttpClient client = new DefaultHttpClient(); String postURL = "http://www.bhtelecom.ba/imenik_telefon.html?a=search"; HttpPost post = new HttpPost(postURL); post.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("di", "035")); params.add(new BasicNameValuePair("br", "819443")); params.add(new BasicNameValuePair("btnSearch","Tra%C5%BEi")); UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8); post.setEntity(ent); HttpResponse responsePOST = client.execute(post); HttpEntity resEntity = responsePOST.getEntity(); if (resEntity != null) { //todo } //checking for cookies, they are OK List<Cookie> cookies = client.getCookieStore().getCookies(); if (cookies.isEmpty()) { Log.d(TAG, "no cookies"); } else { for (int i = 0; i < cookies.size(); i++) { Log.d(TAG, "cookies: " + cookies.get(i).toString()); } } resEntity.consumeContent(); HttpGet get = new HttpGet("http://www.bhtelecom.ba/index.php?id=3226&"); get.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); HttpResponse responseGET = client.execute(get); HttpEntity entityGET = responseGET.getEntity(); List<Cookie> cookiesGet = client.getCookieStore().getCookies(); if (cookies.isEmpty()) { Log.d(TAG, "no cookies"); } else { for (int i = 0; i < cookiesGet.size(); i++) { Log.d(TAG, "cookies GET: " + cookiesGet.get(i).toString()); } } //a method to check the data, I pass the InputStream to it, and do the operations, I've tried "manually", and passing the InputStream to JSOUP, but without success in either case. samplemethod(entityGET.getContent()); client.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } 

Поэтому, если кто-нибудь может найти ошибку в моей настройке или найти способ сделать эти два запроса, а затем получить данные, HTTP Entity, которые я мог бы использовать в качестве ввода (InputStream) для прекрасного парсера JSOUP, который Быть потрясающим. Или, может быть, я понял все, что нужно странице, и мне нужно сделать мои запросы с разными параметрами, я был бы признателен. Я использовал Wireshark и Charles Debugging Proxy, чтобы получить представление о том, что создавать (попробовал оба, дважды проверить), и нашел только этот идентификатор сеанса, fe_typo_user и некоторые другие параметры, используемые для отслеживания времени на сайте и т. Д., И я попытался Пропуская их тоже "_ utma" " _utmb" … и так далее.

У меня есть некоторые другие методы, используя «более простые», POST-методы с данными в ответ, и я успешно их получил, но эта конкретная проблема с этим сайтом сводит меня с ума. Заранее спасибо за вашу помощь.

После многих, многочасовых попыток и отслеживания входящих / исходящих пакетов, мне наконец удалось найти решение.

Все дело в «ошибке» или поведении HTTPClient. Если вы добавите параметр в сообщение, а параметр – emty, имеет значение «», оно не будет отправлено с запросом. Я не знал этого и думал, что эти параметры, так как они пусты, не изменят enything, а с помощью JSOUP я не передал их на запросы.

Так,

 params.add(new BasicNameValuePair("_uqid", "")); params.add(new BasicNameValuePair("_cdt", "")); params.add(new BasicNameValuePair("_hsh", "")); 

Были местами, представляющими интерес.

Другое дело, так как эта страница имеет ответ 302, и JSOUP имеет значение followRedirects, установленное как «true» как значение по умолчанию, мне пришлось сделать это false также потому, что этот метод POST, а «запрос на последующий запрос» должен быть GET, но JSOUP предполагает Это все еще POST и все испортит.

Так вот, надеюсь, кто-то найдет это полезным 🙂