Несколько запросов и ответов Http с использованием HttpURLConnection - PullRequest
0 голосов
/ 16 октября 2011

Добрый день в моем часовом поясе.

Я занимаюсь разработкой очень простого http-бота. Я использую класс javax.net.ssl.HttpsURLConnection, и мне нужно сделать несколько запросов. Фрагмент кода:

HttpURLConnection urlConnection =
    (HttpURLConnection) new URL(url+"?"+firstParameters).openConnection();
urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
headerFields = urlConnection.getHeaderFields();
keys = headerFields.keySet();
for(String key : keys){
    if(key != null && key.contains("ookie")){
        cookies = urlConnection.getHeaderField(key);
        break;
    }
}
for(String cookie : cookies.split(";")){
    if(cookie.contains("JSESSION")){
        JSESSION = cookie.split("=")[1];
        break;
    }
}
document = new InputSource(urlConnection.getInputStream());
parser.setDocument(document);
attributesId.put("name",new ArrayList<String>(Arrays.asList(attributesNames)));
elementsIds.put("INPUT",attributesId);
elements = parser.getValues(elementsIds);
for(String attr : attributesNames){
    secondParameters = secondParameters.replaceAll("#r"+index,elements.get(attr));
}
urlConnection.getInputStream().close();
//Second call 
urlConnection = (HttpURLConnection) new URL(url2).openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSION);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
payload = new PrintWriter(urlConnection.getOutputStream());
payload.print(secondParameters);
payload.flush();
payload.close();

Подводя итог приведенному выше коду, сначала я делаю запрос без какой-либо полезной нагрузки и вижу правильный ответ от сервера, но проблема заключается в том, что я делаю второй запрос (теперь с полезной нагрузкой и с файлом cookie JSESSION), то, что я получаю, это тот же ответ, который я получил в первом запросе, похоже, я снова делаю первый запрос. Итак, мой вопрос, что я делаю не так? Мне просто нужно открыть одно соединение, а затем изменить заголовки и полезную нагрузку? Есть какое-нибудь руководство, связанное с несколькими запросами http (со смешанными методами, post и get)?

Заранее спасибо

С наилучшими пожеланиями

1 Ответ

1 голос
/ 16 октября 2011

Я никогда не использовал HttpURLConnection раньше.Я обычно использую код Apache HTTPClient .На их домашней странице есть множество документов и учебных пособий.

Я не смог найти никаких учебных пособий по HttpURLConnection, но я попробовал.Вот моя маленькая программа, которая похожа на вашу.

http://pastie.org/2706758

Кажется, что работает:

  1. Это делает первоначальный запросчтобы получить cookie-файл сеанса.
  2. Обрабатывает заголовки ответа для получения cookie-файла.
  3. Он выполняет второй запрос на проверку подлинности сеанса с помощью cookie-файла в запросе.
  4. Еслииспользуется правильное имя пользователя / пароль, тогда результаты показывают, что сеанс аутентифицирован.

Несколько вещей, которые я заметил в вашем коде:

  • Ваш код не обрабатываетсянесколько Cookie заголовков в ответе.Моя, кажется, справляется с этим лучше.
  • Вы уверены, что все, что вам нужно, это JSESSION?Может быть, вам не хватает других файлов cookie?
  • Отладили ли вы свой код, чтобы убедиться, что файл cookie JSESSION настроен правильно?Я добавил несколько вызовов trim() в свой код обработки файлов cookie, чтобы убедиться, что некоторые пробелы там не проскальзывают.
  • Я не вижу реальной стоимости вашего secondParameters.Я понятия не имею, если они действительны.Вы отладили свой код, чтобы убедиться, что значение secondParamters выглядит хорошо.Вы можете увидеть в моем коде, что я публикую на сервере.Кстати, я бы использовал StringBuilder вместо + для их построения.

Надеюсь, это поможет.

...