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

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

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

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

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

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

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

您可以在此处找到有关协议的一些高级信息

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

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

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

我已经探索了所有的答案,今天我成功地成为了一个纯粹的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(); } } } 

您可能想要的一些外部链接:

自由软件 :/ / / / / / / / / / / /