简单来说,我编写了一个JSE Swing应用程序,需要与我之前编写的GWT服务器通信.我非常喜欢GWT在它的javascript和服务器端之间进行远程处理的方式,并希望我可以利用这种机制.有没有人设法以这种方式使用GWT-RPC?我应该去Restlet吗?
我一直在尝试选择哪种技术用于REST应用程序,并找到了4个候选者:
但是未能区分四者并选择其中一个,哪个最好?标准是:
a.稳定性\成熟度
b.安全
c.易于使用
d.支持
谢谢!
我正在教授一门关于移动应用程序开发的大学课程,并希望向我的学生介绍一个用于App Engine的REST框架,以帮助他们为他们正在构建的Android应用程序进行数据存储.任何人都可以推荐符合以下条件的App Engine Java REST框架:
一定有:
很高兴有:
不重要:
从我的网络搜索,Restlet看起来最好.我还应该考虑其他任何框架吗?
我正在使用Restlet来实现Web服务.客户端(也使用Restlet)对服务器进行多次连续调用,但在少量调用成功完成后,进一步调用会挂起服务器,显示消息:
信息:停止接受新的连接和事务.考虑增加最大线程数.
我试过了:
getContext().getParameters().add("maxThreads", "200");
Run Code Online (Sandbox Code Playgroud)
但这没有用.在任何情况下,似乎客户端应该能够进行无限数量的呼叫,并且增加maxThreads只会增加限制.看起来我没有释放一些资源或在每次客户电话后断开连接,但我不知道该怎么做.
以下(我可以做的很小)独立程序演示了这个问题.它启动一个简单的服务器,然后客户端多次调用它:
/** You may copy, modify, and re-use this code as you see fit - Jim Irrer */
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.restlet.Application;
import org.restlet.Component;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.Restlet;
import org.restlet.Server;
import org.restlet.data.MediaType;
import org.restlet.data.Method;
import org.restlet.data.Protocol;
import org.restlet.data.Status;
import org.restlet.representation.InputRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
import org.restlet.resource.Directory;
public class SimpleServerPut extends Component implements Runnable {
private static final int PORT = 8080;
private static int readToByteArray(InputStream inputStream, byte[] buf) …
Run Code Online (Sandbox Code Playgroud) 如何将自己的标题添加到ClientResource
Restlet 包装的请求中?例如,我已经读过您在直接使用时可以使用以下内容Client
:
Form headers = (Form) request.getAttributes().get(HeaderConstants.ATTRIBUTE_HEADERS);
if (headers == null) {
headers = new Form();
request.getAttributes().put("org.restlet.http.headers", responseHeaders);
}
headers.add("X-Some-Header", "the value");
Run Code Online (Sandbox Code Playgroud)
但是,我基本上遵循他们的教程中提供的代码,我不知道ClientResource
应该访问哪个成员来设置标头:
ClientResource clientResource = new ClientResource("http://webserviceurl");
MyClassResource classResource = clientResource.wrap(classResource.class);
MyClass class;
try { class = resource.retrieve(); } catch (Exception e) { System.out.println("fail."); }
Run Code Online (Sandbox Code Playgroud)
如何修改retrieve()
以添加一些标题?
我的应用程序尝试设置上下文属性:
final Router router = new Router();
router.attachDefault(HttpListener.class);
org.restlet.Application myApp = new org.restlet.Application() {
@Override
public org.restlet.Restlet createInboundRoot() {
getContext().getAttributes().put("mysharedobj", new MySharedObj());
return router;
};
};
Component component = new Component();
component.getDefaultHost().attach("/", myApp);
new Server(Protocol.HTTP, port, component).start();
Run Code Online (Sandbox Code Playgroud)
在我的HttpListener中,我声明上下文不是null:
public class HttpListener extends ServerResource {
public MySharedObj mysharedobj;
public HttpListener() { }
@java.lang.Override
public void init(Context context, Request request, Response response) {
assert context != null; // throws java.lang.AssertionError
// my end goal is to pass a shared object to my …
Run Code Online (Sandbox Code Playgroud) 尝试使用此代码从我的webservice(在app-engine上运行)获取我的Android客户端上的一些数据时
ClientResource cr = new ClientResource("https://myapp.appspot.com/restlet/service/");
IServiceResource res = cr.wrap(IServiceResource.class);
m_Services = res.getServices();
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
05-20 08:30:15.406: ERROR/AndroidRuntime(31767): Caused by: Communication Error (1001) - Could not change the mode after the initial handshake has begun.
Run Code Online (Sandbox Code Playgroud)
我有https支持的org.restlet.ext.ssl.jar,我使用这一行添加客户端
Engine.getInstance().getRegisteredClients().add(new HttpsClientHelper(null));
Run Code Online (Sandbox Code Playgroud)
这是我最接近https://调用工作,因为我搬到了resm 2.1m4(因为我需要entityBuffering而移动).
有任何想法吗?我需要分享的其他任何信息?
我使用此代码创建了多个路径和组件:
Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost().attach(pair.uriPattern, pair.restlet);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());
Run Code Online (Sandbox Code Playgroud)
我的心跳代码有效.
但是当我使用路由器时pair.restlet
,它不起作用:
Router router = new Router();
Restlet fooHandler = new FooRouter();
Restlet barHandler = new BarRouter();
router.attach("/foo/{fooId}", fooHandler);
router.attach("/bar/{barId1}/{barId2}", barHandler);
Run Code Online (Sandbox Code Playgroud)
Restlet doc仅给出了使用Application
类的路由器的示例:
public class FirstStepsApplication extends Application {
@Override
public synchronized Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/hello", HelloWorldResource.class);
return router;
}
}
Run Code Online (Sandbox Code Playgroud)
实际上使用我的基于路由器的代码会产生与命中不存在的URL相同的效果.
所以我问:
我遇到了一个非常奇怪的问题,浏览器的HTTP请求似乎被Restlet服务器使用的Simple连接器丢弃.
服务器设置:
服务器正在为浏览器提供网页,并使用javascript的XMLHttpRequest来获取更新.但是,其中一些XMLHttpRequests并未完成.Chrome的javascript调试程序显示这些的"失败"状态; Firefox的调试器记录完成时间,没有HTTP状态代码和记录的响应.数据包嗅探器指示有问题的请求实际发送到服务器,但服务器从不响应.调试显示这些请求永远不会到达我们的服务器代码.
我已经验证了Firefox,Chrome以及IE的问题.所有三个浏览器(最新版本)都遇到了这个问题.而且,每个浏览器都重复且可重复地具有完全相同请求的问题.但是这组请求在三种浏览器之间有所不同.
真正奇怪的是,当使用服务器的机器名称(测试在LAN上运行)时,问题确实浮出水面,但在使用机器的IP地址时却没有.从摘要切换回基本身份验证也会使问题消失,就像用Jetty替换Simple连接器一样.
我现在倾向于转向Jetty,但我仍然想知道发生了什么.有没有人见过这样的行为,或者对这里出了什么问题有所了解?
我有一个骆驼Java DSL路由调用restlet端点.当我手动敲击时,路线没有任何问题.但是,当我尝试通过代码抽取大量请求时,我得到" Timeout等待来自池的连接 "
以下是相同的堆叠种族:
2016-01-29 14:09:38.650 WARN 20256 --- [pool-3-thread-2] org.restlet : An error occurred during the communication with the remote HTTP server.org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:412)
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:298)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:238)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339)
at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105)
at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119)
at org.restlet.Client.handle(Client.java:153)
at org.restlet.Restlet.handle(Restlet.java:275)
at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:79)
at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:98)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:668)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:596) …
Run Code Online (Sandbox Code Playgroud)