我有一個普通的Java應用程序,並希望訪問一個GWT RPC端點。任何想法如何做到這一點?我的GWT應用程序在GAE/J上,我可以使用REST,但我已經擁有GWT RPC端點,並且不想構建另一個外觀。如何從非GWT(但是Java)應用程序調用服務器上的GWT RPC方法?
是的,我看過Invoke a GWT RPC service from Java directly,但這個討論進入了一個不同的方向。
我有一個普通的Java應用程序,並希望訪問一個GWT RPC端點。任何想法如何做到這一點?我的GWT應用程序在GAE/J上,我可以使用REST,但我已經擁有GWT RPC端點,並且不想構建另一個外觀。如何從非GWT(但是Java)應用程序調用服務器上的GWT RPC方法?
是的,我看過Invoke a GWT RPC service from Java directly,但這個討論進入了一個不同的方向。
包中的RPC協議的GWT中的Java實現com.google.gwt.user.server.rpc
和com.google.gwt.user.server.rpc.impl
不幸的是,只包括請求的反序列化和響應的序列化。真正的工作是在類ServerSerializationStreamReader
和ServerSerializationStreamWriter
(每個約750行代碼)中完成的。爲了實現一個客戶端,顯然需要對請求進行序列化並反序列化響應,但由於協議和AFAIK沒有可用的文檔,因此沒有可用的Java客戶端實現,您可能必須對(de)序列化類並編寫你自己的代碼來完成「相反」的任何事情。
您可以找到有關協議here
不幸的是一些高層次的信息,我認爲jarnbjo是對有關重新實現瀏覽器的一半的RPC機制。或者,如果您最終不得不爲遠程客戶端編寫REST接口,則可以將您的GWT應用程序從RPC切換出來,並在其中使用REST接口,並在外部客戶端和GWT之間共享您的客戶端庫客戶端界面。
GWT SyncProxy允許您從純Java(而非JSNI)代碼訪問GWT RPC服務(例如方法)。
有關詳細信息,請參閱http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/。
該項目現已轉移到GitHub:https:// github。COM/jcricket/GWT-syncproxy – JCricket 2015-04-04 19:55:46
你可以找到你這篇文章GwtRpcCommLayer在搜索什麼:http://googlewebtoolkit.blogspot.com/2010/07/gwtrpccommlayer-extending-gwt-rpc-to-do.html
我已經探索了所有的答案,今天我成功了作爲一個純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
爲什麼這個社區wiki?它是否由於編輯過多而自動切換? – 2010-07-15 14:00:02