2012-02-10 3 views
1

Я отправляю запрос POST для создания некоторого ресурса данных на сервере. Я получаю код ответа 201 - все в порядке. Но мне также нужно получить 2 заголовка ответа. Эти заголовки содержат атрибуты созданного ресурса. Я не нашел способ, как это сделать, используя API ConnectionRequest.LWUIT IO ConnectionRequest: запрос POST, как получить заголовки ответа?

Класс имеет методы readHeaders (соединение) и getHeader (соединение). Но я не мог использовать их, когда получил ответ - получил исключение.

Мой пример кода приведен ниже:

ConnectionRequest reqresp = new ConnectionRequest() { 
    protected void buildRequestBody (java.io.OutputStream os) { 
    Logger.inst().write ("buildRequestBody"); 
     final String body = "Dummy Request Body"; // necessary for my request 
     try { 
      os.write (body.getBytes()); 
     } 
     catch (Exception ex) { 
      final String errMsg = ex.toString(); 
      Logger.inst().write (errMsg); 
      throw new RuntimeException (errMsg); 
     } 
    } 

    protected void readResponse (InputStream input) throws IOException { 
     // Actually this method will not be called. 
     Logger.inst().write ("readResponse"); 
     String respText; 
     try { 
      respText = Util.readToString (input); 
     } 
     catch (Exception ex) { 
      final String errMsg = ex.toString(); 
      Logger.inst().write (errMsg); 
      throw new RuntimeException (errMsg); 
     } 
     Logger.inst().write (respText); 
    } 
}; 
reqresp.setUrl ("MY SERVER URL"); 
reqresp.setPriority (ConnectionRequest.PRIORITY_HIGH); 
reqresp.setPost (true); 
reqresp.addRequestHeader ("header1", "val1"); 
reqresp.addRequestHeader ("Content-type", "application/json"); 
reqresp.addResponseCodeListener (new ActionListener() { 
     public void actionPerformed (ActionEvent ae) { 
      Logger.inst().write ("ResponseCodeListener:"); 
      Logger.inst().write (ae.toString()); 
      if (ae instanceof NetworkEvent) { 
       NetworkEvent evt = (NetworkEvent)ae; 
       Logger.inst().write ("message: " + evt.getMessage()); 
       Logger.inst().write ("response code: " + evt.getResponseCode()); 
      } 
     } 
    }); 
reqresp.addResponseListener (
    new ActionListener() { 
     public void actionPerformed (ActionEvent ae) { 
      Logger.inst().write ("ResponseCodeListener:"); 
      Logger.inst().write (ae.toString()); 
      if (ae instanceof NetworkEvent) { 
       NetworkEvent evt = (NetworkEvent)ae; 
       Logger.inst().write ("message: " + evt.getMessage()); 
       Logger.inst().write ("response code: " + evt.getResponseCode()); 
      } 
     } 
    } 
); 

NetworkManager.getInstance().addToQueue (reqresp); 

ответ

1

Я не смог выполнить задачу, используя IO LWUIT в. Но я сделал это легко, используя HTTPConnection от MIDP и не столкнулся с проблемами.

Небольшой комментарий о HTTPConnection API MIDP. Это синхронно. Таким образом, я не хотел использовать его в основном графическом интерфейсе. Кроме того, API является низкоуровневым. Поэтому мне пришлось реализовать какую-то оболочку, чтобы скрыть детали и выполнить асинхронный запрос HTTP в отдельном потоке.

Теперь один комментарий о классе IO ConnectionRequest LWUIT. Я нашел его программистом-недружелюбным. Он представляет собой запрос и ответ. Таким образом, неясно, какие методы связаны с запросом и что ответ.

1

Попробуйте что-нибудь подобное в ConnectionRequest:

protected void readHeaders(Object connection) throws IOException { 
    String val = getHeader(connection, "MyHeaderName"); 
} 
+0

Уже пробовал - этот метод не назывался. Я не знал почему. Я также попытался переопределить getHeader(). То же самое - не называлось. Я перепробовал initConnection (соединение), и он был вызван. Круто! Я попытался сохранить переданное соединение в нем и использовать его позже в прослушивающем кодах ответа, но получил исключение (соединение уже закрыто). – Zakhar

+0

Если я вызываю readHeaders() в initConnection() после вызова базовой реализации, то я получил исключение позже, когда вызывается метод buildRequestBody() (err msg - это что-то вроде «невозможно изменить запрос, который уже запущен») , – Zakhar

+0

Проверьте подпись метода. Если полученный вами ответ равен 2xx, он должен быть вызван (посмотрите на код), ваши другие подходы к обходным методам не очень хорошо вписываются в жизненный цикл. –

Смежные вопросы