首页 文章

如何从非 GWT(但 Java)gapplication 调用服务器上的 GWT RPC 方法?

提问于
浏览
12

我有一个常规的 Java 应用程序,并希望访问 GWT RPC 端点。知道如何实现这一目标吗?我的 GWT 应用程序在 GAE/J 上,我可以使用 REST,但我已经有了 GWT RPC 端点,并且不想构建另一个 façade。

是的,我见过直接从 Java 调用 GWT RPC 服务,但这个讨论朝着不同的方向发展。

5 回答

  • 6

    GWT SyncProxy 允许您从纯 Java(而不是 JSNI)代码访问 GWT RPC 服务(e.g 方法)。

    有关详细信息,请参阅http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/

  • 4

    不幸的是,包com.google.gwt.user.server.rpccom.google.gwt.user.server.rpc.impl中 RPC 协议的 GWT 中的 Java 实现仅包括请求的反序列化和响应的序列化。真正的工作是在ServerSerializationStreamReaderServerSerializationStreamWriter类中完成的(每行约 750 行代码)。

    要实现客户端,您显然需要序列化请求并反序列化响应,但由于没有可用于协议的文档和 AFAIK 没有可用的 Java 客户端实现,您可能必须 reverse-engineer(de)serialization 类并编写自己的代码到做一切“反过来”。

    你可以找到一些关于协议的 high-level 信息这里

  • 2

    您可以在本文中找到有关 GwtRpcCommLayer 的内容:http://googlewebtoolkit.blogspot.com/2010/07/gwtrpccommlayer-extending-gwt-rpc-to-do.html

  • 1

    不幸的是,我认为 jarnbjo 必须重新实现浏览器的一半 RPC 机制。

    或者,如果您最终必须为远程客户端编写 REST 接口,则可以将 GWT 应用程序从 RPC 转移并在那里使用 REST 接口,并在外部客户端和 GWT 的 client-side 接口之间共享客户端库。

  • 1

    我已经探索了所有的答案,今天我成功地成为了一个纯粹的 Java 客户端。

    SyncProxy 需要你拥有 GWT project(server 方面的整个代码。为此,您只需创建一个将 SyncProxy 激发到其中的附加类。在这个类中,您应该导入所有需要的类和函数,这就是您需要服务器代码的原因。

    你应该检查以下文件是否可以从服务器下载:

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

    我在 cookiemanager 之前添加代码,因为我的服务器端 uri 是 HTTPS。我的类包含一个登录操作然后触发 GWT 请求。这是我的 code(I 已经升级了 SyncProxy,因为它不支持 cookie/session auth check.):

    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

相关问题