2010-01-22 15 views
11

Mam zwykłą aplikację Java i chcę uzyskać dostęp do punktu końcowego GWT RPC. Masz pomysł, jak to zrobić? Moja aplikacja GWT działa na GAE/J i na przykład mogę używać REST, ale mam już punkty końcowe GWT RPC i nie chcę budować kolejnej fasady.Jak mogę wywołać metodę GWT RPC na serwerze z luki typu GWT (ale Java)?

Tak, widziałem Invoke a GWT RPC service from Java directly, ale ta dyskusja zmierza w innym kierunku.

+2

Dlaczego ta wiki społeczności? Czy to po prostu automatycznie przełącza się ze zbyt wielu zmian? –

Odpowiedz

4

Implementacja Java w GWT protokołu RPC w pakietach com.google.gwt.user.server.rpc i com.google.gwt.user.server.rpc.impl niestety obejmuje tylko deserializację żądań i serializację odpowiedzi. Prawdziwa praca jest wykonywana w klasach ServerSerializationStreamReader i ServerSerializationStreamWriter (każda z 750 linii kodu).

Aby zaimplementować klienta, trzeba oczywiście szeregować żądanie i deserializować odpowiedź, ale ponieważ nie ma dokumentacji dostępnej dla protokołu i AFAIK, nie ma dostępnych implementacji klienta Java, prawdopodobnie musiałbyś wykonać inżynierię odwrotną (de) klasy serializacji i napisać własny kod, aby zrobić wszystko "na odwrót".

Można znaleźć jakieś info na wysokim szczeblu na temat protokołu here

1

Niestety, myślę jarnbjo jest prawo o konieczności reimplement połowa przeglądarki mechanizmu RPC.

Alternatywnie, jeśli masz zamiar napisać interfejs REST dla klientów zdalnych, możesz zmienić aplikację GWT z dala od wywołań RPC i użyć tam również interfejsu REST oraz udostępnić swoją bibliotekę klientów między klientami zewnętrznymi a GWT interfejs po stronie klienta.

1

ja zbadali wszystkie odpowiedzi i dziś mi się uda do pracy jako czystego klienta java.

SyncProxy wymaga, abyś miał cały kod projektu GWT (po stronie serwera). Aby to zrobić, wystarczy utworzyć dodatkową klasę, która uruchomi w niej program SyncProxy. W tej klasie należy zaimportować wszystkie potrzebne klasy i funkcje, dlatego potrzebny jest kod serwera.

i należy sprawdzić następujący plik można pobrać z serwera:

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

dodać kod przed cookiemanager, ponieważ mój serwer side uri HTTPS. A moja klasa zawiera akcję logowania, a następnie uruchamia żądanie GWT. To jest mój kod (Mam zmodernizowane SyncProxy trochę, ponieważ nie obsługuje plików cookie/sesji sprawdzanie 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(); 
       } 

       } 
} 

Niektóre poza ogniwo może chcesz:

https://code.google.com/p/gwt-syncproxy/wiki/QuickStart http://cancerberonia.blogspot.de/2012/10/testing-gwt-service-classes.html