2012-02-10 1 views
1

서버에 일부 데이터 리소스를 만들도록 POST 요청을 보냅니다. 응답 코드 201이 표시됩니다. 모두 정상입니다. 그러나 응답에서 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에 대한 간단한 설명. 그것은 동기식입니다. 그래서, 나는 그것을 메인 GUI 스레드에서 사용하고 싶지 않았다. 또한 API는 낮은 수준입니다. 그래서, 세부 사항을 숨기고 별도의 스레드에서 비동기 적으로 HTTP 요청을 실행하는 일종의 래퍼를 구현해야했습니다.

이제 LWUIT의 IO ConnectionRequest 클래스에 대해 한 가지 주석을 달았습니다. 나는 프로그래머에 친숙하지 않다는 것을 알았다. 요청과 응답을 모두 나타냅니다. 따라서 요청과 관련된 메소드와 응답에 대한 설명이 명확하지 않습니다.

1

ConnectionRequest이 같은 시도 :

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

이미 시도 - 해당 메서드가 호출되지 않았습니다. 이유를 모르겠어. 나 또한 getHeader()를 오버라이드하려고 시도했다. 같은 - 전화하지 않았다. 나는 initConnection (연결)을 무시하고 호출되었다. 시원한! 전달 된 연결을 저장하고 응답 코드 수신기에서 나중에 사용하려고 시도했지만 예외가 발생했습니다 (연결이 이미 닫혔습니다). – Zakhar

+0

기본 구현을 호출 한 후 initConnection()에서 readHeaders()를 호출하면 나중에 buildRequestBody() 메서드가 호출 될 때 예외가 발생합니다 (오류 메시지는 "이미 시작된 요청을 수정할 수 없음"과 같은 오류입니다) . – Zakhar

+0

메소드의 서명을 확인하십시오. 받은 응답이 2xx라면 호출해야합니다 (코드 참조). 다른 해결 방법은 수명주기에 적합하지 않습니다. –