簡體   English   中英

如何從非GWT(但Java)gapplication調用服務器上的GWT RPC方法?

[英]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.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();
                } 

              }
}

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

自由軟件 :/ / / / / / / / / / / /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM