Как мне записать `HttpServletRequest`, которые отправляются в` doPost` в `HttpServlet` для последующего воспроизведения? - PullRequest
8 голосов
/ 02 февраля 2011

Я хочу вывести некоторые запросы (типа javax.servlet.http.HttpServletRequest) в файл, а затем воспроизвести их из файла, чтобы я мог проверить будущие изменения на HttpServlet.Каков наилучший способ сделать это?

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

Есть ли более простой способ сделать это?

** РЕДАКТИРОВАТЬ: для уточнения, это не запросы с использованием браузера.Пока что ни один из ответов не решает мою конкретную проблему, которая, я полагаю, сводится к сериализации и десериализации HttpServletRequest.Я попытался просто извлечь байты из входного потока, возвращенного request.getInputStream ().К сожалению, если я превращу это в строку, кажется, что получающиеся байты не могут быть проанализированы с помощью Message.Builder.mergeFrom (bytes).

Я выставляю вознаграждение любому, кто знает, как решить моюпроблема.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Возможно, вам стоит взглянуть на Селен (http://seleniumhq.org/).

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

Если вы пытаетесь сделать что-то еще, возможно, вы могли бы объяснить, что вы в конечном итоге пытаетесь сделать.

1 голос
/ 11 февраля 2011

В моем конкретном случае я в конечном итоге решил проблему, используя CodedOutputStream для записи com.google.protobuf.GeneratedMessage (foo ниже):

ByteArrayOutputStream bos = new ByteArrayOutputStream();
CodedOutputStream cos = CodedOutputStream.newInstance(bos);
foo.writeTo(cos);

Это можно прочитать с помощью CodedInputStream с чем-то вроде:

byte[] ba = readBytesFromOutputFile();
CodedInputStream cis = CodedInputStream.newInstance(ba);

Затем CodedInputStream можно передать построителю сообщений для завершения десериализации.

1 голос
/ 02 февраля 2011

Существует много локальных инструментов обратного прокси, которые могут «записывать и воспроизводить» сеанс HTTP. Обычно вы настраиваете свой браузер на использование прокси-сервера localhost, выполняете действия, сохраняете сеанс, а затем воспроизводите его. JMeter и Charles - это два инструмента на основе Java.

Другой вариант - использовать HttpClient , чтобы программно использовать ваш сервлет. Преимущество использования JUnit для выполнения тестов состоит в том, что легче убедиться, что вы получаете «правильный» ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...