Как получить и распаковать данные GZIP в Java?

Я отправляю данные с моего iPhone на сервер. Код следующий:

      ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]]; 
     [request setShouldCompressRequestBody:YES];   // gzip compression
     [request setTimeOutSeconds:60];
     [request setPostValue:emailString forKey:@"email"]; 
     [request setPostValue:jsonStr forKey:@"jsonstring"];
     [request setPostValue:pwd forKey:@"password"];
     [request setDelegate:self]; 
     [request startAsynchronous];

Я пытался найти то, как я могу получить эти данные на моем сервере, но не смог найти никакой помощи. Получу ли я его, используя req.getParameter(). Если да, то каким будет имя параметра, а затем как разархивировать его и использовать параметры электронной почты, jsonstring, пароля. Заранее спасибо.

2 ответа

Самый простой способ (IMO) сделать это в стандартной среде J2EE - использовать фильтр сжатия GZIP. Вы можете найти некоторый пример в этом вопросе (хотя этот, насколько я вижу, только о фильтре ответов) или здесь (я полагаю, что этот может также выполнить декомпрессию запроса, о которой вы спрашивали).

Затем вы подключаете такой фильтр к своему веб-приложению, используя <filter> элемент в вашем web.xml (см. здесь пример использования фильтров сервлетов), таким образом, избегая любых жестко закодированных зависимостей из кода вашего веб-приложения.

Все, что вам нужно здесь, это какой-нибудь контейнер сервлетов, такой как Tomcat (я не думаю, что вам нужна целая среда Java EE, если ваши серверные приложения не являются более сложными, например, распределенными, подмножество JSP/Servet кажется достаточным). По сути, это сервер (и HTTP-сервер, и сервер в целом для любых необработанных данных), где JSP и сервлеты выполняют обработку запросов. Кстати, у Tomcat есть встроенная поддержка сжатия gzip, которая просто настраивается. Так должно быть легко.

Затем вам нужно написать сервлет, который извлекает все параметры, упомянутые в клиентском коде iOS, из вашего HTTP-запроса, создает и отправляет ответ. (Есть много статей, официальной документации и т. Д. О сервлетах). То, как они будут извлечены, не будет зависеть от того, используете ли вы GZIP или нет, распаковка должна выполняться сервером заранее.

ОБНОВИТЬ

Что касается имен параметров, я думаю (я не разработчик iOS), они являются строками сразу после сообщения "setPostValue" в вашем коде, например
...
[request setPostValue:emailString forKey: @ "email"];
...
Итак, они в настоящее время

emailString
jsonStr
pwd

Резюме, код чтения должен быть таким:

public abstract class MyServlet extends HttpServlet {

  /* (non-Javadoc)
  * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  */
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    String emailString = req.getParameter("emailString");
    String jsonStr = req.getParameter("jsonStr");
    String pwd = req.getParameter("pwd");
    //...       
  }
}
Другие вопросы по тегам