Подтвердить что ты не робот

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() функции?

4b9b3361

Ответ 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, это будет плохой практикой.