Как декодировать данные http POST в Java? - PullRequest
6 голосов
/ 28 декабря 2011

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

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

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

Ответы [ 3 ]

13 голосов
/ 29 декабря 2011

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);
  }
}
7 голосов
/ 30 декабря 2011

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

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

QueryStringDecoder decoder = new QueryStringDecoder("?" +
    request.getContent.toString(org.jboss.netty.util.CharsetUtil.UTF_8));
3 голосов
/ 28 декабря 2011

Какую версию 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

...