Как декодировать данные http POST в Java?

Я использую Netty, и я должен принимать и анализировать запросы http POST. Насколько я могу судить, Нетти не имеет встроенной поддержки для сообщений, только получает. (Это довольно низкоуровневая библиотека, которая занимается примитивными сетевыми операциями. Использование контейнера сервлетов, который делает все это из коробки, не является вариантом.)

Если у меня есть содержимое запроса POST в виде массива байтов, каков самый быстрый и безошибочный способ разобрать его на карту параметры?

Я мог бы написать это сама, но тут должны быть некоторые методы, встроенные в JDK, которые делают это проще. И я готов поспорить,что есть некоторые gotchas и угловые случаи, чтобы иметь дело.

3 ответов


Netty имеет расширенный декодер запроса POST (HttpPostRequestDecoder), который может декодировать Атрибуты Http, содержимое FileUpload с фрагментированной кодировкой.

вот простой пример декодирования формы

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  HttpRequest request = (HttpRequest) e.getMessage();
  HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), request);

  InterfaceHttpData data = decoder.getBodyHttpData("fromField1");
  if (data.getHttpDataType() == HttpDataType.Attribute) {
     Attribute attribute = (Attribute) data;
     String value = attribute.getValue()
     System.out.println("fromField1 :" + value);
  }
}

вы можете использовать HttpPostRequestDecoder в Netty 4.X. Он поддерживает все виды тела столба. Нетти 4.на данный момент x помечен как альфа, но очень стабилен. См.BodyParser В Xitrum.

Если вам нужно только разобрать простое тело, вы все равно можете использовать QueryStringDecoder В Netty 3.x, рассматривая тело POST как часть после "?"в URL, как это:

QueryStringDecoder decoder = new QueryStringDecoder("?" +
    request.getContent.toString(org.jboss.netty.util.CharsetUtil.UTF_8));

какую версию netty вы используете? HttpRequest Netty поддерживает метод POST. Не известно о какой-либо библиотеке, которая могла бы анализировать байты для сопоставления параметров. Обычно это делает контейнер сервлетов. Взгляните на источник tomcat о том, как они реализовали метод processParameters() http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java