Получение двоичного параметра HTTP Post в Java / Tomcat / HttpServlet - PullRequest
2 голосов
/ 07 января 2010

У меня есть двоичное значение, которое закодировано в URL, а затем отправлено в HttpServlet. Следующий код показывает, как я впервые попытался извлечь эти данные. Очень просто, за исключением того, что результатом является строка, а не байты.

Сначала казалось, что это работает, за исключением того, что дополнительный байт появился в трех байтах от конца. В итоге я понял, что мои данные обрабатываются как Unicode и конвертируются из одной кодировки Unicode в UTF-8.

Итак, кроме получения всего тела сообщения и его синтаксического анализа самостоятельно, как я могу извлечь свои данные, не обрабатывая их как строку после декодирования кодировки URL? Я неправильно понял спецификации для публикуемых данных или это специфическая проблема Java / Tomcat?

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // Receive/Parse the request
    String requestStr = request.getParameter("request");
    byte[] rawRequestMsg = requestStr.getBytes();

Вот фрагмент тестового скрипта Python, который я использую для запроса:

    urlRequest = urllib.urlencode( {'request': rawRequest} )

    connection = urllib.urlopen(self.url, data = urlRequest)
    result = connection.readlines()
    connection.close()

Ответы [ 3 ]

3 голосов
/ 07 января 2010

Есть два возможных решения:

  • ASCII-кодирование ваших данных перед отправкой. Base64 был бы разумным выбором. Расшифруйте его в своем сервлете, и у вас снова будет исходный двоичный файл.

  • Используйте тип содержимого формы multipart/form-data (http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4) для кодирования ваших двоичных данных в виде потока байтов; тогда ваш сервлет может сделать servletRequest.getReader() для чтения данных, опять же в виде двоичного потока.

2 голосов
/ 07 января 2010

Я думаю, что это должно работать (он обрабатывает запрос как однобайтовую кодировку, поэтому преобразование в String полностью обратимо):

String someSingleByteEncoding = "ISO-8859-1";
request.setCharacterEncoding(someSingleByteEncoding);
String requestStr = request.getParameter("request"); 
byte[] rawRequestMsg = requestStr.getBytes(someSingleByteEncoding);
0 голосов
/ 07 января 2010

Вы можете сделать это с помощью оболочки сервлета (HttpServletRequestWrapper) ... перехватить запрос и перехватить тело запроса перед его декодированием

но, вероятно, лучше всего отправить данные в виде файла для загрузки (тип данных multipart / form-data)

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