GWT — Нет ответа от обратного вызова из службы REST

#json #gwt #rest #asynchronous

#json #gwt #rest #асинхронный

Вопрос:

У меня есть моя служба REST:http://localhost:4242/myrestservice/getobject который возвращает некоторые данные JSON

Затем у меня есть мой клиент GWT:http://localhost:4242/gwtclient предполагается, что этот клиент выполняет асинхронные вызовы службы REST.

Я довольно новичок в этом, поэтому моей первой идеей было сделать следующее :

 RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode("http://localhost:4242/myrestservice/getobject"));
builder.setHeader("Accept", "application/json");
builder.setCallback(new MyObjectDescCallback());    
builder.setRequestData("");
Request req  = builder.send();

...

final class MyObjectDescCallback implements RequestCallback {
            public void onError(Request request, Throwable exception) {
                showAlert("error = " exception.getMessage());

                GWT.log(exception.getMessage());
       }
            public void onResponseReceived(Request request, Response response) {
showAlert("response = "   response.getStatusCode());
//Do my stuff here
}
}
}
  

К сожалению, я не получаю ответа.

Я проверил в службе Rest, и она действительно отправляет объект

Кажется, что мое приложение GWT не получает ответа.

Есть идеи, как заставить это работать?

Обновить

Вот мои результаты с Firebug :

 Response Headers
Server  Apache-Coyote/1.1
Content-Type    application/json
Transfer-Encoding   chunked
Date    Sun, 24 Apr 2011 11:04:15 GMT

Request Headers
Host    127.0.0.1:4242
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept  application/json
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://localhost:4242/gwtclient/gwtclient.html
Origin  http://localhost:4242
  

Но я получаю ответ.getStatusCode() = 0
и пустой ответ!

ОБНОВЛЕНИЕ 2 :

Я чувствую себя таким тупым сейчас…

На самом деле проблема заключалась в SOP …

Я использовал URL localhost, но в моем коде я использовал 127.0.0.1 !

Черт….

Комментарии:

1. Я читал о SOP, но поскольку они оба находятся на Localhost с одним и тем же портом, я считаю, что в моем случае это не должно быть проблемой: en.wikipedia.org/wiki/Same_origin_policy если я не неправильно понял?

2. Вы использовали Firebug? Вы можете проверить, выполняет ли ваш клиент GWT вызов или нет, на сетевой панели. Вы также можете увидеть ответ, который возвращает ваша служба rest.

3. я обновил свой пост журналами Firebug… ответ пустой

Ответ №1:

Вы говорите, что хотите использовать асинхронный обратный вызов, но вы никогда не используете new AsyncCallback<string>() в своем коде. Вот как я выполняю асинхронные вызовы на сервер с помощью моего приложения gwt: (Я не использую JSON, но, я думаю, здесь это не имеет особого значения)

 request object = new request();
object.getMessageXml("test.php", "GET", null, new AsyncCallback<String>() {

    @Override
    public void onFailure(Throwable caught) {
        //error handling
    }

    @Override
    public void onSuccess(String result) {
        // do some stuff with the result
    }
});
  

И это класс запроса:

 public void getMessageXml(String file, String type, String requestData, final AsyncCallback<String> callback) {

        RootLayoutPanel.get().addStyleName("loading");

        final String url = "test/"   file;
        RequestBuilder rb;

        try {
            if(type == "POST") {
                rb = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
            }
            else {
                rb = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
            }

            rb.setHeader("Content-Type", "application/x-javascript; charset:ISO-8859-1");
            rb.sendRequest(requestData, new RequestCallback() {

                @Override
                public void onResponseReceived(Request request, Response response) {

                    if(Response.SC_OK == response.getStatusCode()) {

                        callback.onSuccess(response.getText()); 
                    }
                    else {
                        //error 
                    }
                    RootLayoutPanel.get().removeStyleName("loading");   
                }

                @Override
                public void onError(Request request, Throwable exception) { 
                    callback.onFailure(exception);
                }   
            }); 
        }
        catch(RequestException rex) {
            callback.onFailure(rex);
        }   
    }
  

[РЕДАКТИРОВАТЬ:]
Может быть, вы найдете что-нибудь здесь:

Комментарии:

1. я также внес эти изменения, но я все еще получаю ответ.getStatusCode() = 0

2. В своем ответе я опубликовал ссылку с некоторой информацией о gwt и json. Может быть, у вас что-то с этим?

3. Это действительно расстраивает, потому что я уже переходил по этой ссылке раньше. Используя Firebug, я вижу, что ответ получен, он даже показывает мне правильную длину. За исключением того, что Resonse пуст.

4. Как я сказал выше, проблема заключалась в SOP … я использовал 127.0.0.1 вместо localhost в своем коде.

5. привет, @ guigui42, можешь, пожалуйста, сказать мне, по какой ссылке ты перешел, чтобы реализовать вышеуказанную вещь. У меня такая же ситуация, но я не могу найти для нее решение.