【问题标题】:How can I call a GWT RPC method on a server from a non GWT (but Java) gapplication?如何从非 GWT(但 Java)gapplication 调用服务器上的 GWT RPC 方法?
【发布时间】:2011-01-08 04:20:45
【问题描述】:

我有一个常规的 Java 应用程序并且想要访问一个 GWT RPC 端点。知道如何做到这一点吗?我的 GWT 应用程序在 GAE/J 上,例如我可以使用 REST,但我已经拥有 GWT RPC 端点并且不想构建另一个外观。

是的,我见过Invoke a GWT RPC service from Java directly,但这次讨论转向了不同的方向。

【问题讨论】:

  • 为什么是这个社区维基?它只是从太多编辑中自动切换吗?

标签: java google-app-engine gwt rpc


【解决方案1】:

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

SyncProxy 需要您拥有 GWT 项目(服务器端)的全部代码。为此,您只需创建一个将 SyncProxy 触发到其中的附加类。在这个类中,你应该导入所有需要的类和函数,这就是你需要服务器代码的原因。

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

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

我在 cookiemanager 之前添加代码,因为我的服务器端 uri 是 HTTPS。 我的课程包括一个登录操作,然后触发 GWT 请求。 这是我的代码(我稍微升级了 SyncProxy,因为它不支持 cookie/session auth 检查。):

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

【讨论】:

    【解决方案2】:

    您可以在这篇关于 GwtRpcCommLayer 的文章中找到您搜索的内容:http://googlewebtoolkit.blogspot.com/2010/07/gwtrpccommlayer-extending-gwt-rpc-to-do.html

    【讨论】:

      【解决方案3】:

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

      另外,如果您最终不得不为远程客户端编写一个 REST 接口,您可以将您的 GWT 应用程序从 RPC 切换到那里也使用 REST 接口,并在外部客户端和 GWT 的客户端之间共享您的客户端库侧接口。

      【讨论】:

        【解决方案4】:

        GWT SyncProxy 允许您从纯 Java(不是 JSNI)代码访问 GWT RPC 服务(例如方法)。

        详情请见http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/

        【讨论】:

          【解决方案5】:

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

          要实现客户端,您显然需要序列化请求并反序列化响应,但由于没有可用的协议文档和 AFAIK 没有可用的 Java 客户端实现,您可能必须对(反)序列化进行逆向工程类并编写您自己的代码以“反其道而行之”。

          你可以找到一些关于协议here的高级信息

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-20
            • 2013-11-24
            • 1970-01-01
            • 1970-01-01
            • 2011-07-18
            • 1970-01-01
            • 1970-01-01
            • 2013-11-17
            相关资源
            最近更新 更多