Можно ли прочитать значение HTTP-сообщения, используя inputtream? - PullRequest
0 голосов
/ 08 января 2012

Я отправляю http-файл сервлету по протоколу http, который сейчас выполняет:

String xmlString = request.getParameter("xml");

Затем я преобразовываю строковую переменную xml в StringReader и InputSource во время SAX-разбора xml.

parser.parse(new InputSource(new StringReader(xmlString)));

Мне было любопытно, если бы я мог как-то получить значение как InputSource для начала?

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

Ответы [ 4 ]

4 голосов
/ 08 января 2012

Если ваш xml является параметром, вы ничего не можете сделать. И, как отметили JB Nizet и skaffman, вам не стоит об этом беспокоиться. У вас есть вещь только один раз в памяти, и вы выполняете чтение только один раз.

Но если xml - это само тело сообщения, вы можете прочитать его с помощью:

parser.parse(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));
1 голос
/ 08 января 2012

На самом деле рекомендуемый способ публикации файла с использованием HTTP - использовать multipart/form-data (отметьте это RFC-1867 ).

Используя это, вы даже можете опубликовать несколько файлов, указав их типы MIME и их кодировку - большинство ответов используют UTF-8 ... но весьма опасно предположить, что new StringReader(xmlString) почтиэквивалентно, но в некоторой степени неправильно, так как без givin 'любая кодировка оставит резервный jvm в кодировке по умолчанию' server '.

Для обработки такой загрузки файла без накладных расходов фреймворка (таких как Struts2 ... если хотите) использовать FileUpload apache lib.

Они рекомендуют использовать классический API (rfc), но предоставляют другую умную функцию для использования stream напрямую ...

Теперь, говоря о разборе, мой POV должен использовать читателя в соединении с типом mime (заданным FileUpload) для загруженного файла.Таким образом, с FileUpload вы получите доступ к FileItem, в котором item.getContentType() поможет вам создать InputStreamReader с помощью этого конструктора

Редактировать

Если вы хотитечтобы пойти с каркасом, еще на один шаг дальше, чем в Struts 2. Вот то, что я бы порекомендовал для чтения. Это очень подробный учебник о том, как справляться с загрузкой файлов с использованием Spring 3 updload progly и загрузка с HTML

1 голос
/ 08 января 2012

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

0 голосов
/ 08 января 2012

Как вы отправляете свой XML?Можно ли отправить XML как HTTP-данные, а не как HTTP-параметр?Тогда вы сможете перенаправить HttpInputStream на InputSource, не передавая его из String.

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

...