11

我需要实现一个调用 Web 服务并返回响应的函数。

我试过

public String getFolderJson(String path) {  
           String result="initial_value";
           StringBuilder param = new StringBuilder();  
           param.append("?sessionId=").append(getSessionId());  
           param.append("&path=").append(path);  
           RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "https://localhost/folder" + param);  
                   try {  
                        builder.sendRequest(null, new RequestCallback() {  
                        @Override  
                        public void onResponseReceived(Request request,
                                Response response) {  
                              result = response.getText();
                              System.out.println(response.getText());  
                                            //I need to return "result"   
                        }  
                        @Override  
                        public void onError(Request request, Throwable exception) {}  
                          });  
                    return result; //the result get returned before the response is recieved.So i am getting the return value "initial_value".
                   }      
                   catch (RequestException e) {}  
        return null;
    }

在调用 getFolderJson()Web 服务时成功调用。但是result在收到响应之前返回。所以我得到了返回值“initial_value”。
函数时如何从响应中返回值getFolderJson()

4

3 回答 3

7

GWT 不支持同步 Ajax,因此您必须使用异步模式编写应用程序。

GWT 用来执行请求的低级对象是XMLHttpRequest(旧的 IE 版本除外),并且 GWT 总是open()在 async 设置为 true 的情况下调用它的方法。因此,拥有同步 ajax 的唯一方法是维护自己修改后的XMLHttpRequest.java. 但是同步 ajax 是个坏主意,甚至 jQuery 也弃用了这种可能性。

所以gwt中的正常方式应该是你的方法返回void,并且你传递一个带有回调的附加参数以在响应可用时执行。

public void getFolderJson(String path, Callback<String, String> callback) {  
    RequestBuilder builder = new RequestBuilder(...);
    try {
      builder.sendRequest(null, new RequestCallback() {  
        @Override  
        public void onResponseReceived(Request request, Response response) {
          callback.onSuccess(response.getText());  
        }  
        @Override  
        public void onError(Request request, Throwable exception) {}
          callback.onFailure(exception.getMessage());  
        });
    } catch (RequestException e) {
        callback.onFailure(exception.getMessage());  
    }  
}

我宁愿为此使用 gwtqueryPromises语法,而不是 request-builder 之一:

  Ajax.get("http://localhost/folder?sessionId=foo&path=bar")
    .done(new Function(){
      public void f() {
        String text = arguments(0);
      }
    });
于 2013-03-16T07:37:49.433 回答
1

我猜builder.sendRequest(xxx)会返回类似Future的东西,你可以从那个对象中得到结果。你使用的是RequestBuilder的异步方法,应该也有一些同步方法。

RequestBuilder 是从哪里来的?我可以为你检查 api。

好的,试试这个:

public String getFolderJson(String path) {
    String result = "initial_value";
    StringBuilder param = new StringBuilder();
    param.append("?sessionId=").append(getSessionId());
    param.append("&path=").append(path);
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
            "https://localhost/folder" + param);
    final SynchronousQueue resultQueue = new SynchronousQueue();
    try {
        builder.sendRequest(null, new RequestCallback() {
            @Override
            public void onResponseReceived(Request request,
                    Response response) {
                resultQueue.put(response.getText());
                System.out.println(response.getText());
            }

            @Override
            public void onError(Request request, Throwable exception) {
            }
        });
        return resultQueue.take();
    } catch (RequestException e) {
    }
    return result;
}

似乎RequestBuilder没有任何同步方法来获取结果,只有回调。

请注意,此方法将阻塞,直到收到响应。如果在 gwt 的事件处理线程中调用此方法,这将是一个不好的做法。

于 2013-03-16T06:11:00.563 回答
0

尝试上面提供的相同解决方案,但不使用匿名回调。

public String getFolderJson(String path) { 

    RequestBuilder builder = new RequestBuilder(...);
    HttpCallback cb=new HttpCallback();

    try {
      builder.sendRequest(null, cb);
    } catch (RequestException e) {
    // exception handling
        logger.severe(cb.err);
    }  

    return cb.result;
}

class HttpCallback implements RequestCallback{

    String result;
    String err;

    HttpCallback(){}

    @Override
    public void onResponseReceived(Request request, Response response) {            
        result=response.getText());     
    }

    @Override
    public void onError(Request request, Throwable exception) {
        err=exception.getMessage();     
    }       
}
于 2018-05-16T04:25:33.460 回答