2011-02-13 2 views
1

GWT에서 웹 응용 프로그램을 코딩하고 있습니다. 내 모든 HTTP 요청을 처리하고 서버의 응답을 반환하는 클래스가 있습니다. 이 내 현재 코드입니다 : 나는 방법에 HttpRequest를 호출 할 때try 블록 반환 body 코드가 실행되기 전에 문자열

try { 

     Request request = builder.sendRequest(requestData, new RequestCallback() { 

      @Override 
      public void onResponseReceived(Request request, Response response) { 
       if(200 == response.getStatusCode()) { 
        messageXml = response.getText(); 

       } 
       else { 
        Window.alert("There was an error (1) :-("); 
        messageXml = "ERROR"; 

       } 
      } 


      @Override 
      public void onError(Request request, Throwable exception) { 
       Window.alert("There was an error (2) :-("); 
       messageXml = "ERROR"; 

      } 
     }); 
     Window.alert(messageXml); 
     return messageXml; 
    } 
    catch (RequestException e) { 
      Window.alert("Could not connect to the server :-("); 
      return "ERROR"; 
     } 

는 먼저 문자열을 반환하고 그 후에는 시도 본문의 코드를 실행 (변수 messageXml는 상수로 정의된다). 예컨대 내가 할 때 그것은 (문자열 아직 콘텐츠가 없기 때문에) 제 널을 출력하고, 그 문자열의 내용 후

request object = new request(); 

    String test = object.httpRequest(file, type, requestData); 
    Window.alert(test); 

. 아무도 왜이 메서드는 좋아하는 행동을 알 수 있습니까?

+1

는 "변수 messageXml가 상수로 정의된다"-하지만 당신은 그것을에 값을 할당하는 ! –

답변

3

messageXml이 상수로 정의되었는지 여부는 여기에서 문제가되지 않습니다. Request#sendRequest()은 비동기 작업이므로 messageXml에 값이 할당 된시기에 대한 가정을 할 수 없습니다. 자세한 내용은 GWT의 Getting Used to Asynchronous Calls을 참조하십시오.

public void getMessageXml(String requestData, 
          final AsyncCallback<String> callback) { 
    try { 
    // Modify for your application. 
    RequestBuilder rb = new RequestBuilder(Method.GET, 
     "http://www.mycompany.com/getMessageXml"); 

    rb.sendRequest(requestData, new RequestCallback() { 
     @Override 
     public void onError(Request request, Throwable caught) { 
     callback.onFailure(caught); 
     } 

     @Override 
     public void onResponseReceived(Request request, Response response) { 
     if (Response.SC_OK == response.getStatusCode()) { 
      callback.onSuccess(response.getText()); 
     } else { 
      // Use a correctly typed exception here. 
      callback.onFailure(...); 
     } 
     } 
    }); 
    } catch (RequestException rex) { 
    callback.onFailure(rex); 
    } 
} 

그리고 메소드 호출 : : Request#sendRequest()를 사용하는 올바른 방법은 콜백 함께

object.getMessageXml(someRequestString, new AsyncCallback<String>() { 
    @Override 
    public void onFailure(Throwable caught) { 
    // Handle error. 
    } 

    @Override 
    public void onSuccess(String messageXml) { 
    // Process response 
    } 
}); 
+0

감사! 문제 해결됨. –

+0

도와 드리겠습니다. –

관련 문제