Ответ 1
GWT SyncProxy позволяет вам получить доступ к службам RPC GWT (например, методы) из чистого кода Java (не JSNI).
Подробнее см. http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/.
У меня есть обычное Java-приложение и вы хотите получить доступ к конечной точке GWT RPC. Любая идея, как это сделать? Мое приложение GWT находится на GAE/J, и я могу использовать REST, например, но у меня уже есть конечные точки GWT RPC и вы не хотите создавать другой фасад.
Да, я видел Вызывать службу GWT RPC непосредственно из Java, но это обсуждение идет в другом направлении.
GWT SyncProxy позволяет вам получить доступ к службам RPC GWT (например, методы) из чистого кода Java (не JSNI).
Подробнее см. http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/.
Реализация Java в GWT протокола RPC в пакетах com.google.gwt.user.server.rpc
и com.google.gwt.user.server.rpc.impl
, к сожалению, охватывает только десериализацию запросов и сериализацию ответов. Реальная работа выполняется в классах ServerSerializationStreamReader
и ServerSerializationStreamWriter
(каждая примерно 750 строк кода).
Чтобы реализовать клиента, вам, очевидно, необходимо сериализовать запрос и десериализовать ответ, но поскольку нет доступной документации для протокола и реализации AFAIK без Java-клиента, вам, вероятно, придется перепроектировать сериализацию (de) классы и напишите свой собственный код, чтобы сделать все "по-другому".
Здесь вы можете найти информацию о протоколе
Вы можете найти то, что вы ищете в этой статье о 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();
}
}
}
Некоторая внешняя ссылка, которую вы можете захотеть:
https://code.google.com/p/gwt-syncproxy/wiki/QuickStart http://cancerberonia.blogspot.de/2012/10/testing-gwt-service-classes.html