GWT: обрабатывать данные JSON после отправки http-запроса - PullRequest
2 голосов
/ 18 марта 2012

Я работаю над веб-приложением GWT, которое должно взаимодействовать с общим веб-сервером. К сожалению, сервер поддерживает только PHP, поэтому я не могу использовать GWT RPC. Вот почему я хочу использовать простой PHP-скрипт на стороне сервера, который возвращает все необходимые данные в формате JSON. Поскольку я довольно новичок в GWT, мой код основан на следующем примере:
http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/GettingStartedJSON
Сценарий PHP, кажется, работает нормально. Firebug показывает мне возвращенные данные JSON и порт 200: Ответ:

[{"key1":"k1","value1":"v1"},{"key2":"k2","value2":"v2"},{"key2":"k3","value3":"v3]

Однако ответ никогда не обрабатывается. Вот мой код:

private static final String JSON_URL = "http://www.myUrl/myScript.php";

public HashMap<String, Integer> loadCalendarTable(String p1, String p2) {
    table = new HashMap<String, Integer>();
    String url = JSON_URL+"?p1="+p1+"&p2="+p2;
    url = URL.encode(url);

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
    try {
        Request request = builder.sendRequest(null, new RequestCallback() {
            public void onError(Request request, Throwable exception) {
                Window.alert("Couldn't retrieve JSON");
            }
            public void onResponseReceived(Request request, Response response) {
                if (200 == response.getStatusCode()) {
                    try {
                        // parse the response text into JSON
                        JSONValue jsonValue = JSONParser.parse(response.getText());
                        JSONArray jsonArray = jsonValue.isArray();
                        if (jsonArray != null) {
                            HashMap<String, Integer> hm = updateTable(jsonArray); 
                        } 
                        else
                            throw new JSONException();
                    } 
                    catch (JSONException e) {
                        Window.alert("Could not parse JSON");
                    }
                } 
                else 
                    Window.alert("Couldn't retrieve JSON (" + response.getStatusText() + ")");
            }
        });
        //(*)
    } 
    catch (RequestException e) {
        Window.alert("Couldn't retrieve JSON");
    }
    return table;
}

private HashMap<String, Integer> updateTable(JSONArray array) {
//do something
return table;}

При выполнении приложения на веб-сервере не возникает никаких исключений и не появляется никаких предупреждений. Используя некоторые предупреждения (которые я опускал в приведенном выше коде для удобства чтения), я заметил, что инструкция try в новом RequestBuilder () выполнена. Другое предупреждение в (*) показывает, что инструкция try пройдена. (Никаких исключений не происходит, как упоминалось ранее). Очевидно, что метод onResponseReceived () никогда не выполняется. Я никогда не вызывал этот метод, поэтому это может быть причиной моей проблемы. Но тогда я не понимаю, где мне следует вызывать onResponseReceived ().

Примечание: Я опустил свой PHP-скрипт, потому что он фактически такой же, как показано в онлайн-примере (http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/GettingStartedJSON). Кроме того, похоже, что скрипт работает правильно.

1 Ответ

1 голос
/ 19 марта 2012

Откуда вы знаете, что onResponseRectained не выполняется?Это следует вызывать, когда ваш script.php возвращает данные JSON.Предполагая, что ваш сервер отправляет обратно код состояния 200, ответ может быть проанализирован, но с данными ничего не делается

try {
  // parse the response text into JSON
  JSONValue jsonValue = JSONParser.parse(response.getText());
  JSONArray jsonArray = jsonValue.isArray();
  if (jsonArray != null) {
    HashMap<String, Integer> hm = updateTable(jsonArray); 
    // Now what? hm isn't actually used for anything...
  } else {
    throw new JSONException();
  }

Из значения, возвращенного в конце метода, table, по-видимому, важно, но он будет возвращен, пусто до того, как будет вызван обратный вызов onResponseRectained.Это связано с тем, что все вызовы GWT Ajax являются асинхронными - сценарий не будет останавливаться при ожидании возобновления работы сервера.Создайте предупреждение с response.getTest () в блоке if (jsonArray! = Null), и вы можете обнаружить, что этот код в конце концов вызывается .Если это так, вы стали жертвой Это не асинхронно - обычно считается хорошей практикой JavaScript (и все, кроме обязательного в GWT) ждать получения результатов, когда они будут готовы, и продолжать выполнение в нормальном режиме.Тем временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...