Gwt请求构建器 – 如何返回响应字符串

我需要实现一个调用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服务。 但是在收到respnse之前返回result 。 所以我得到了retunr值“initial_value”。
如何在getFolderJson()函数中从响应中返回值?

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

GWT用于执行请求的低级对象是XMLHttpRequest (旧的IE版本除外),并且GWT始终将asy​​nc设置为true的open()方法调用。 因此,拥有同步ajax的唯一方法是维护自己的XMLHttpRequest.java修改版本。 但同步ajax是一个坏主意,甚至jQuery已经弃用了这种可能性。

因此,gwt中的常规方法应该是您的方法返回void ,并且在响应可用时传递带回调的附加参数。

 public void getFolderJson(String path, Callback 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()); } } 

我宁愿使用gwtquery Promises语法而不是请求构建器:

  Ajax.get("http://localhost/folder?sessionId=foo&path=bar") .done(new Function(){ public void f() { String text = arguments(0); } }); 

我想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的事件处理线程中调用此方法,则这将是一种不好的做法。

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

 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(); } }