Как сконвертировать данные?
От: srr Россия  
Дата: 10.08.04 07:56
Оценка:
Помогите начинающему

В сервлете получаю запрос типа POST. если доставать даные используя request.getParameter("QW") то все хорошо.
Но необходимо достать все тело запроса — делаю так:

ServletInputStream InSt=request.getInputStream() ;
BufferedReader is = new BufferedReader(new InputStreamReader(InSt));
String fromServer="";
String ls=null;
while ((ls= is.readLine()) != null)
{
fromServer +=ls;
ls=null;
}
is.close();

короче в fromServer все тело и накапливается. в итоге в fromServer строка вида "%3C%3Fxml+version%3D%221.0%22%3F%3E%0D%0A%3CSaveData%3E%3CWorkSpaseTeleTecon+Name%3D%22%D0+%D0%B0" — это я так понимаю закодированые Mime в application/x-www-form-urlencoded — Так вот как мне это все ракодировать? или хотя бы как достать так чтобы раскодировать не пришлось самому?
Re: Как сконвертировать данные?
От: A_Gura Россия http://a-gura.livejournal.com
Дата: 10.08.04 10:50
Оценка:
Здравствуйте, srr, Вы писали:

srr>Помогите начинающему


srr>В сервлете получаю запрос типа POST. если доставать даные используя request.getParameter("QW") то все хорошо.

srr>Но необходимо достать все тело запроса — делаю так:

srr> ServletInputStream InSt=request.getInputStream() ;

srr> BufferedReader is = new BufferedReader(new InputStreamReader(InSt));
srr> String fromServer="";
srr> String ls=null;
srr> while ((ls= is.readLine()) != null)
srr> {
srr> fromServer +=ls;
srr> ls=null;
srr> }
srr> is.close();

srr>короче в fromServer все тело и накапливается. в итоге в fromServer строка вида "%3C%3Fxml+version%3D%221.0%22%3F%3E%0D%0A%3CSaveData%3E%3CWorkSpaseTeleTecon+Name%3D%22%D0+%D0%B0" — это я так понимаю закодированые Mime в application/x-www-form-urlencoded — Так вот как мне это все ракодировать? или хотя бы как достать так чтобы раскодировать не пришлось самому?


    String requestStr = request.getQueryString();
... << RSDN@Home 1.1.3 stable >>
Работать надо над собой...
Re[2]: Как сконвертировать данные?
От: srr Россия  
Дата: 10.08.04 18:00
Оценка:
Здравствуйте, A_Gura, Вы писали:

A_G>
A_G>    String requestStr = request.getQueryString();
A_G>


Это не помогает — запрос то ведь типа POST он в теле все пергоняет а getQueryString(); достате парметры запроса из заголовка те что после адреса идут.Достать все содержимое тела запроса я могу но его надо сконвертировать (декодиросвать) — вот в чем загвоздка у меня.
доставать по парметрам типа getParameter("QW") — это конечно работате но в моем случае никаких парметров небудет — сразу в теле POST запроса пергоняется документ.

Помогите плиз !
Re[3]: Как сконвертировать данные?
От: Eugeny__ Украина  
Дата: 11.08.04 08:02
Оценка:
Здравствуйте, srr, Вы писали:

srr>Здравствуйте, A_Gura, Вы писали:


A_G>>
A_G>>    String requestStr = request.getQueryString();
A_G>>


srr>Это не помогает — запрос то ведь типа POST он в теле все пергоняет а getQueryString(); достате парметры запроса из заголовка те что после адреса идут.Достать все содержимое тела запроса я могу но его надо сконвертировать (декодиросвать) — вот в чем загвоздка у меня.

srr> доставать по парметрам типа getParameter("QW") — это конечно работате но в моем случае никаких парметров небудет — сразу в теле POST запроса пергоняется документ.

srr>Помогите плиз !


Может, не самое прямое решение, но работает

  /**
   * Метод разбирает строки URL, и заменяет %ХХ на их байтовое представление
   * Логика взята из метода
   * org.apache.catalina.util.RequestUtil.parseParameters(Map map, byte[] data, String encoding)
   * @param request String строка запросы
   * @return String строка с нормальными символами
   *
   */
  public static String parseURLEncodedRequest(String request, String encoding){
    int len = request.length();
    byte[] data = new byte[len];
    request.getBytes(0, len, data, 0);
    int    ix = 0;
    int    ox = 0;
    while (ix < data.length) {
      byte c = data[ix++];
      if (c == '%'){
        data[ox++] = (byte)((convertHexDigit(data[ix++]) << 4)
                        + convertHexDigit(data[ix++]));
      } else {
        data[ox++] = c;
      }
    }
    try {
      return new String(data, 0, ox, encoding);
    }
    catch (UnsupportedEncodingException ex) {
      return new String(data, 0, ox);
    }
  }

  /**
   * Convert a byte character value to hexidecimal digit value.
   * Логика взята из метода
   * org.apache.catalina.util.RequestUtil.convertHexDigit(byte b)
   * @param b the character value byte
   */
  private static byte convertHexDigit(byte b) {
      if ((b >= '0') && (b <= '9')) return (byte)(b - '0');
      if ((b >= 'a') && (b <= 'f')) return (byte)(b - 'a' + 10);
      if ((b >= 'A') && (b <= 'F')) return (byte)(b - 'A' + 10);
      return 0;
  }
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re: Как сконвертировать данные?
От: Аноним  
Дата: 11.08.04 08:03
Оценка: 3 (1)
Здравствуйте, srr, Вы писали:

srr>Помогите начинающему


srr>В сервлете получаю запрос типа POST. если доставать даные используя request.getParameter("QW") то все хорошо.

srr>Но необходимо достать все тело запроса — делаю так:

srr> ServletInputStream InSt=request.getInputStream() ;

srr> BufferedReader is = new BufferedReader(new InputStreamReader(InSt));
srr> String fromServer="";
srr> String ls=null;
srr> while ((ls= is.readLine()) != null)
srr> {
srr> fromServer +=ls;
srr> ls=null;
srr> }
srr> is.close();

srr>короче в fromServer все тело и накапливается. в итоге в fromServer строка вида "%3C%3Fxml+version%3D%221.0%22%3F%3E%0D%0A%3CSaveData%3E%3CWorkSpaseTeleTecon+Name%3D%22%D0+%D0%B0" — это я так понимаю закодированые Mime в application/x-www-form-urlencoded — Так вот как мне это все ракодировать? или хотя бы как достать так чтобы раскодировать не пришлось самому?


После того, как цикл отработал, воспользуйся URLDecoder:

fromServer = URLDecoder.decode(fromServer, "UTF-8");
Re[2]: Как сконвертировать данные?
От: srr Россия  
Дата: 11.08.04 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:


А>После того, как цикл отработал, воспользуйся URLDecoder:


А>
А>fromServer = URLDecoder.decode(fromServer, "UTF-8"); 
А>


Огромное спасибо

я еше чуть подрпавил способ извлечения даных из POST запроса, а то с прямым использованием getInputStream могут как выяснилось возникнуть проблемы при закрытии потока.
Короче кому интерсно вот итог — достате даныве из тела запроса и декодирует их в нормальный текст:

BufferedReader bf= request.getReader();

String tf=null;
String fromServer="";
while((tf=bf.readLine())!=null)
fromServer+=tf;

fromServer = URLDecoder.decode(fromServer);


System.out.println(fromServer);
Re[3]: Как сконвертировать данные?
От: anterior_ Россия  
Дата: 11.08.04 10:10
Оценка:
Здравствуйте, srr, Вы писали:

srr>Здравствуйте, Аноним, Вы писали:



А>>После того, как цикл отработал, воспользуйся URLDecoder:


А>>
А>>fromServer = URLDecoder.decode(fromServer, "UTF-8"); 
А>>


srr>Огромное спасибо


srr>я еше чуть подрпавил способ извлечения даных из POST запроса, а то с прямым использованием getInputStream могут как выяснилось возникнуть проблемы при закрытии потока.

srr>Короче кому интерсно вот итог — достате даныве из тела запроса и декодирует их в нормальный текст:

srr> BufferedReader bf= request.getReader();


srr> String tf=null;

srr> String fromServer="";
srr> while((tf=bf.readLine())!=null)
srr> fromServer+=tf;

srr> fromServer = URLDecoder.decode(fromServer);



srr> System.out.println(fromServer);


Был рад помочь.
Единственное, что хочу добавить — метод URLDecoder.decode(String) обьявлен как deprecated, вместо него следует использовать URLDecoder.decode(String, String), где второй параметр определяет кодировку. В твоем случае — UTF-8
Giving up smoking is the easiest thing in the world. I know because I've done it thousands of times. (c) Mark Twain
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.