Gwt Request builder - как вернуть строку ответа
Мне нужно реализовать функцию, которая вызывает веб-службу и возвращает ответ.
Я пробовал
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()
веб-служба называется успешно. Но result
возвращается до получения ответа. Поэтому я получаю значение retunr "initial_value".
Как вернуть значение из ответа при getFolderJson()
функции?
Ответы
Ответ 1
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());
}
}
Я предпочел бы синтаксис gwtquery Promises
для этого вместо request-builder one:
Ajax.get("http://localhost/folder?sessionId=foo&path=bar")
.done(new Function(){
public void f() {
String text = arguments(0);
}
});
Ответ 2
Я думаю, что builder.sendRequest(xxx) вернет что-то вроде Будущего, и вы можете получить результат от этого объекта. Что вы используете, это асинхронный метод 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, это будет плохой практикой.