Доступ к удаленному сервису с помощью GWTP Rest Dispatch

Я хочу разделить пакеты для разработки пользовательского интерфейса и серверной части моего приложения GWTP. В настоящее время мой пользовательский интерфейс обращается к бэкэнду, используя отправку Rest, настроенную следующим образом:

bindConstant().annotatedWith(RestApplicationPath.class).to("/MyProject/api");

Я хочу получить доступ к удаленному сервису с помощью пользовательского интерфейса localhost (запуск приложения GWT с использованием плагина eclipse). Я изменил строку выше на:

bindConstant().annotatedWith(RestApplicationPath.class).to("http://my-app.appspot.com/MyProject/api");

Используя это, вызов успешно достигает сервера (я вижу это в журналах appengine), но пользовательский интерфейс всегда возвращает код состояния 0.

Что не так с приведенной выше настройкой? Нужно ли мне делать что-то еще, чтобы получить доступ к удаленному сервису с помощью пользовательского интерфейса GWT?


person tj-recess    schedule 29.12.2014    source источник


Ответы (1)


Если вы хотите иметь решение, которое работает как на локальном хосте, так и на App Engine, вам нужно использовать что-то вроде этого:

import com.google.gwt.core.client.GWT;
import com.google.gwt.inject.client.AbstractGinModule;
import com.google.inject.Provides;
import com.gwtplatform.dispatch.rest.client.RestApplicationPath;
import com.gwtplatform.dispatch.rest.client.gin.RestDispatchAsyncModule;

public class ServiceModule extends AbstractGinModule {
    @Override
    protected void configure() {
        install(new RestDispatchAsyncModule.Builder().build());
    }

    @Provides
    @RestApplicationPath
    String getApplicationPath() {
        String baseUrl = GWT.getHostPageBaseURL();
        if (baseUrl.endsWith("/")) {
            baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
        }

        return baseUrl + "/MyProject/api";
    }
}

Строка, возвращаемая getApplicationPath, будет привязана к @RestApplicationPath и беспрепятственно использоваться RestDispatch GWTP.

В вашем случае строка будет преобразована в http://localhost:8080/MyProject/api или "http://my-app.appspot.com/MyProject/api" в зависимости от приложения, работающего локально или в App Engine.

person spg    schedule 29.12.2014
comment
Мое приложение отлично работает (как appengine, так и localhost), используя bindConstant().annotatedWith(RestApplicationPath.class).to(/MyProject/api); параметр. Я хочу запустить пользовательский интерфейс на рабочем столе (localhost) и получить доступ к службе, работающей на машинах с движком приложений. - person tj-recess; 30.12.2014
comment
О, теперь я понимаю, что вы имеете в виду. Какой код состояния возвращает сервер? Я понимаю, что ваше приложение GWT получает статус 0, но это фактический HTTP-код, на который отвечает ваше приложение GAE? Если, например, ваш сервер отвечает 200 OK, а ваше приложение GWT интерпретирует ответ как код 0, то это может быть еще одна проблема. - person spg; 02.01.2015
comment
Проблема заключалась в том, что CORS не был включен правильно. Подробнее см. в этой ветке: groups.google.com/forum/#! тема/gwt-платформа/RrSOBeaqcEc - person tj-recess; 03.01.2015