2012-02-10 3 views
1

サーバー上にいくつかのデータリソースを作成するPOSTリクエストを送信します。私はレスポンスコード201を取得します - すべてOKです。しかし、私はまた、応答から2つのヘッダーを取得する必要があります。これらのヘッダーには、作成されたリソースの属性が含まれています。私はConnectionRequestのAPIを使ってそれを行う方法を見つけませんでした。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

私はLWUITのIOを使用してタスクを実行できませんでした。しかし、私はMIDPのHTTPConnectionを使って簡単にそれを行い、問題はありませんでした。

MIDPのHTTPConnection APIに関する小さなコメントが1つあります。それは同期的です。だから、私は主なGUIスレッドでそれを使いたくなかった。さらに、APIは低レベルです。だから、私は、細部を隠し、別のスレッドで非同期的にHTTPリクエストを実行するための何らかのラッパーを実装しなければなりませんでした。

LWUITのIO ConnectionRequestクラスに関するコメントが1つ追加されました。私はそれがプログラマーに不親切であることを発見しました。要求と応答の両方を表します。したがって、どのような方法がリクエストに関連しているのか、また何がレスポンスに関係しているのかは明確ではありません。

1

ConnectionRequestにこのような何かを試してみてください:

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

既に試しました - そのメソッドは呼び出されませんでした。なぜ私は知りませんでした。私もgetHeader()をオーバーライドしようとしました。同じ - 呼び出されませんでした。 initConnection(接続)をオーバーライドして呼び出されました。クール!渡された接続を格納して、応答コードリスナーで後で使用しようとしましたが、例外が発生しました(接続はすでに閉じられています)。 – Zakhar

+0

基本実装の呼び出し後にinitConnection()でreadHeaders()を呼び出すと、buildRequestBody()メソッドが呼び出されたときに例外が発生します(err msgは「既に開始されている要求を変更できません」など) 。 – Zakhar

+0

メソッドのシグネチャをチェックします。あなたが得た応答が2xxであれば、それを呼び出さなければなりません(コードを見てください)、あなたの他の回避策はライフサイクルにうまく適合しません。 –

関連する問題