[英]How can I call a GWT RPC method on a server from a non GWT (but Java) gapplication?
我有一個常規的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.rpc
和com.google.gwt.user.server.rpc.impl
包中RPC協議的GWT中的Java實現僅涵蓋請求的反序列化和響應的序列化。 真正的工作是在ServerSerializationStreamReader
和ServerSerializationStreamWriter
類中完成的(每個代碼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();
}
}
}
您可能想要的一些外部鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.