HTML-сообщение в Java с HttpClient, похоже, не работает для определенного сообщения - PullRequest
0 голосов
/ 08 октября 2011

Я использую HttpClient от Apache для совершения одного звонка и двух звонков на autozone.com. Вызов get предназначен для доступа к домашней странице, чтобы был установлен файл cookie JSessionId. Затем я пытаюсь найти магазины по определенному почтовому индексу с помощью их локатора магазинов, а затем установить первый результат как «Предпочитаемый магазин».

Ранее я обнаружил, что вся информация о пользователе хранится на стороне сервера, и просмотрел с помощью двух постоянных файлов cookie. В основном просто пара имя пользователя и пароль. Эти куки создаются вместе с JSessionId, потому что первый пост, который требует JSessionId, работает отлично. Я также узнал, что они также не возвращают страницу результатов напрямую, вместо этого они возвращают только заголовки Http со статусом 302 «Временно перемещенный». Поэтому я извлекаю новую страницу из заголовков и захожу туда.

Это именно то, что я вижу в моей программе. Вызов на домашнюю страницу успешно загружен, и установлены 3 необходимых файла cookie, и я получаю динамический номер подтверждения сеанса, который необходим для всех почтовых вызовов. Затем я делаю пост-вызов на страницу обработки для StoreLocator, передавая все необходимые аргументы, получаю местоположение результатов, выполняю вызов get и загружаю эту страницу. Я нахожу «prefStoreNumber», уникальный номер системы для идентификации магазина, и сохраняю его. Затем я создаю свой последний пост звонка. Идет на правильную страницу, чтобы обработать предпочтительный выбор магазина. Я снова передаю все аргументы в форме на HTML-странице, и возвращается ответ 302. Проблема возникает, когда я получаю новое местоположение. В HTML должен быть магазин, который я только что выбрал вдоль верхней панели, но вместо этого он остается таким же, как если бы магазин не был выбран. Я знаю, что файлы cookie передаются правильно, иначе я не получил бы результаты магазина.

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

    String useragent, homepage, locatorPage, host, sessionConf, results, preferedPage;
    homepage = "/autozone";
    locatorPage = "/autozone/storelocator/storeLocatorMain.jsp?_DARGS=/autozone/storelocator/storeLocatorSearch.jsp";
    preferedPage = "/autozone/storelocator/storeLocatorMain.jsp?_DARGS=/autozone/storelocator/storeLocatorResults.jsp";
    useragent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
    host = "http://www.autozone.com";
    DefaultHttpClient client = new DefaultHttpClient();
    client.getParams().setBooleanParameter("http.protocol.allow-circular-redirects", true);
    client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, useragent);

    HttpContext session = new BasicHttpContext();
    HttpGet get = new HttpGet(host+homepage);
    get.setHeader("User-Agent", useragent);
    HttpEntity e = client.execute(get, session).getEntity();
    sessionConf = getHTMLValue("_dynSessConf", EntityUtils.toString(e));
    EntityUtils.consume(e);

    HttpPost post = new HttpPost(host+locatorPage);
    List<NameValuePair> form = new ArrayList<NameValuePair>();
    form.add(new BasicNameValuePair("_dyncharset", "ISO-8859-1"));
    form.add(new BasicNameValuePair("_dynSessConf", sessionConf));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.successURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.successURL", " "));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=null"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", " "));
    form.add(new BasicNameValuePair("city", ""));
    form.add(new BasicNameValuePair("_D:city", " "));
    form.add(new BasicNameValuePair("state", "-1"));
    form.add(new BasicNameValuePair("zip", Integer.toString(zip)));
    form.add(new BasicNameValuePair("_D:zip", " "));
    form.add(new BasicNameValuePair("areaCode", ""));
    form.add(new BasicNameValuePair("_D:areaCode", " "));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.findNearestLocations", "submit"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.findNearestLocations", " "));
    form.add(new BasicNameValuePair("_DARGS", "/autozone/storelocator/storeLocatorSearch.jsp"));
    post.setEntity(new UrlEncodedFormEntity(form, "UTF-8"));
    HttpResponse response = client.execute(post, session);
    results = response.getFirstHeader("Location").toString().substring(10);
    EntityUtils.consume(response.getEntity());

    get = new HttpGet(results);
    response = client.execute(get, session);
    e = response.getEntity();
    String storeID = getHTMLValue("prefStoreNumber", EntityUtils.toString(e));
    EntityUtils.consume(e);

    post = new HttpPost(host+preferedPage);
    form = new ArrayList<NameValuePair>();
    form.add(new BasicNameValuePair("_dyncharset", "ISO-8859-1"));
    form.add(new BasicNameValuePair("_dynSessConf", sessionConf));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.preferedStoreSuccessURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.preferedStoreSuccessURL", " "));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", " "));
    form.add(new BasicNameValuePair("prefStoreNumber", storeID));
    form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.setPreferedStore", "submit"));
    form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.setPreferedStore", " "));
    form.add(new BasicNameValuePair("_DARGS", "/autozone/storelocator/storeLocatorResults.jsp"));
    post.setEntity(new UrlEncodedFormEntity(form, "UTF-8"));
    response = client.execute(post, session);
    displayResponse(response);
    results = response.getFirstHeader("Location").toString().substring(10);
    EntityUtils.consume(response.getEntity());

    get = new HttpGet(results);
    response = client.execute(get, session);
    displayResponse(response);

displayResponse только для отладки. В нем перечислены все заголовки ответа, за которыми следует разделитель строк и основной HTML. Извините за многословность, но я хотел убедиться, что моя проблема была хорошо понята.

Обновление: ок. Я запустил WireShark по запросу браузера и моей программы. Я узнал, что я просто пропустил простую ошибку. Когда я извлек prefStoreNumber из HTML-кода, я случайно захватил слишком много, и в нем хранился некоторый случайный HTML-код. Я собираюсь исправить это и посмотреть, будет ли это работать, но были и другие отличия. Я перечислил их ниже. Кто-нибудь из них доставит мне неприятности?:
Поле: Браузер | Программа

Cache-Control: max-age=0|(N/A)  
Origin: http://www.autozone.com|(N/A)  
Content-Type: application/x-www-form-urlencoded|(N/A)  
Accept: text/html,application/xhtml+xml,application/x ml;q=0.9,*/*;q=0.8|(N/A)  
Referer: http://www.autozone .com/autozone/storelocator/storeLocatorMain.jsp?  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetPage=storeLocatorResults&_ requestid=3010533|(N/A)  
Accept-Encoding: gzip,deflate,sdch|(N/A)  
Accept-Language: en-US,en ;q=0.8|(N/A)  
Accept-Charset: ISO-8859 -1,utf-8;q=0.7,*;q=0.3|(N/A)  
Cookie2: (N/A)|$Version=1

Обновление 2: все работало отлично после того, как я правильно проанализировал prefStoreNumber.

...