Как я могу вызвать метод GWT RPC на сервере из приложения не GWT (но Java)? - PullRequest
12 голосов
/ 22 января 2010

У меня есть обычное Java-приложение, и я хочу получить доступ к конечной точке RPC GWT.Есть идеи, как это сделать?Мое приложение GWT находится на GAE / J, и я мог бы, например, использовать REST, но у меня уже есть конечные точки GWT RPC и я не хочу строить другой фасад.

Да, я видел ВызовСлужба GWT RPC непосредственно из Java , но это обсуждение идет в другом направлении.

Ответы [ 5 ]

6 голосов
/ 02 марта 2010

GWT SyncProxy позволяет получать доступ к службам GWT RPC (например, методам) из чистого кода Java (не JSNI).

Подробнее см. http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/.

4 голосов
/ 22 января 2010

Реализация Java в GWT протокола RPC в пакетах com.google.gwt.user.server.rpc и com.google.gwt.user.server.rpc.impl, к сожалению, охватывает только десериализацию запросов и сериализацию ответов. Настоящая работа выполняется в классах ServerSerializationStreamReader и ServerSerializationStreamWriter (каждая примерно 750 строк кода).

Чтобы реализовать клиента, вам, очевидно, необходимо сериализовать запрос и десериализовать ответ, но поскольку для протокола нет доступной документации и AFAIK нет доступных реализаций клиента Java, вам, вероятно, придется перепроектировать (де) сериализацию классы и написать свой собственный код, чтобы делать все "наоборот".

Вы можете найти некоторую высокоуровневую информацию о протоколе здесь

2 голосов
/ 02 сентября 2010

Вы можете найти то, что вы ищете в этой статье о GwtRpcCommLayer: http://googlewebtoolkit.blogspot.com/2010/07/gwtrpccommlayer-extending-gwt-rpc-to-do.html

1 голос
/ 02 апреля 2015

Я изучил все ответы, и сегодня мне удается работать чистым Java-клиентом.

SyncProxy требуется, чтобы у вас был полный код проекта GWT (на стороне сервера). И для этого вы просто создаете один дополнительный класс, который запускает SyncProxy в него. В этом классе вы должны импортировать все необходимые классы и функции, поэтому вам необходим код сервера.

и вы должны проверить, что следующий файл может быть загружен с сервера:

compilation-mappings.txt
*.nocache.js
*.cache.html
*.gwt.rpc

Я добавляю код перед cookiemanager, потому что мой серверный URI - HTTPS. И мой класс включает в себя действие входа в систему, а затем запустить запрос GWT. Это мой код (я немного обновил SyncProxy, потому что он не поддерживает проверку подлинности cookie / сессии).

package com.xxx.xxx.x.xx;

import java.io.IOException;
import java.net.CookieManager;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import net.customware.gwt.dispatch.client.standard.StandardDispatchService;
import net.customware.gwt.dispatch.shared.DispatchException;

import com.gdevelop.gwt.syncrpc.LoginUtils;
import com.gdevelop.gwt.syncrpc.ProxySettings;
import com.gdevelop.gwt.syncrpc.SyncProxy;

public class TestRemoteExecuteAction {

            static Logger logger = Logger.getLogger(TestRemoteExecuteAction.class.getName());
              public static void main(String[] arg) {

                  SyncProxy.setLoggingLevel(Level.ALL);

                try {

                      // Create a trust manager that does not validate certificate chains
                    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
                            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                                return null;
                            }
                            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                            }
                            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                            }
                        }
                    };

                    // Install the all-trusting trust manager
                    SSLContext sc = SSLContext.getInstance("SSL");
                    sc.init(null, trustAllCerts, new java.security.SecureRandom());
                    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

                    // Create all-trusting host name verifier
                    HostnameVerifier allHostsValid = new HostnameVerifier() {
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    };

                    // Install the all-trusting host verifier
                    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

                    CookieManager cookiemanager = LoginUtils.loginFormBasedJ2EE("https:XXXXX", "XXXX", "XXXX");

                    SyncProxy.setBaseURL("https://XXXXXX");

                    StandardDispatchService rpcService =  SyncProxy.createProxy(StandardDispatchService.class,
                            new ProxySettings().setCookieManager(cookiemanager));

                    System.out.println(cookiemanager.getCookieStore().getCookies().get(0));
                    String JSESSIONID = cookiemanager.getCookieStore().getCookies().get(0).getValue();

                    rpcService.execute(new XXXXXAction("XXX"));



                } catch (NoSuchAlgorithmException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (KeyManagementException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (URISyntaxException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (DispatchException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 

              }
}

Внешняя ссылка, которую вы можете захотеть:

https://code.google.com/p/gwt-syncproxy/wiki/QuickStart http://cancerberonia.blogspot.de/2012/10/testing-gwt-service-classes.html

1 голос
/ 12 февраля 2010

К сожалению, я думаю, что jarnbjo прав в том, что нужно переопределить половину механизма RPC браузера.

С другой стороны, если вам в конечном итоге придется написать интерфейс REST для удаленных клиентов, вы можете переключить свое приложение GWT с RPC и использовать там интерфейс REST, а также разделить свою клиентскую библиотеку между внешними клиентами и клиентом GWT. интерфейс.

...