サーバー上にいくつかのデータリソースを作成する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);
既に試しました - そのメソッドは呼び出されませんでした。なぜ私は知りませんでした。私もgetHeader()をオーバーライドしようとしました。同じ - 呼び出されませんでした。 initConnection(接続)をオーバーライドして呼び出されました。クール!渡された接続を格納して、応答コードリスナーで後で使用しようとしましたが、例外が発生しました(接続はすでに閉じられています)。 – Zakhar
基本実装の呼び出し後にinitConnection()でreadHeaders()を呼び出すと、buildRequestBody()メソッドが呼び出されたときに例外が発生します(err msgは「既に開始されている要求を変更できません」など) 。 – Zakhar
メソッドのシグネチャをチェックします。あなたが得た応答が2xxであれば、それを呼び出さなければなりません(コードを見てください)、あなたの他の回避策はライフサイクルにうまく適合しません。 –