资源或 Restlet

Resource or Restlet

我正在使用 Restlet 2.2.1 并构建 Rest 服务。如您所知,Router 用于附加 Restlet 或 Resource 作为目标。

Router router = new Router( getContext() );

router.attach("/healthcheck1",HealthCheckResource.class );
router.attach("/healthcheck2", new HealthCheckRestlet() );

然后你可以在handle()

中实现你的逻辑

想知道哪个最好用?我知道 Resource 有一个非常明确的生命周期(doInit、handle、release ...),并且是实现一次性逻辑(如初始化)的好地方。

在可行的情况下附加 ServerResource subclass 而不是 Restlet 实例,原因如下:

  • 资源是构造 RESTful API 的自然方式。当您在资源 class 上使用 @Get@Put 等注释时,您实际上是在记录 RESTful API 的那一部分,并且是可以提取该信息以自动创建在线文档的工具。如果您使用 Restlet 实例,它响应 GETPUT 等的行为不会立即显现。具有讽刺意味的是,使用 Restlet 可以更轻松地编写 而不是 RESTful.

  • 的 API
  • 每个请求创建一个单独的资源class实例,这意味着一个实例通常被限制在一个线程中,这简化了关于线程安全的推理。相反,相同的 Restlet 实例将用于所有 handle(...) 调用,可能导致复杂的线程安全要求。

因为每个请求都有自己的资源实例,所以资源方法可能需要调用通过应用程序上下文传递或注入资源的内部服务(参见 this Restlet extension)。

顺便说一下,您对 "one time logic like initialization" 的评论可能是一种误解。 doInit 方法为每个实例化资源调用一次(即,对该资源的每个请求一次), 一次。

请注意,我建议不要直接将 Restlet 子class 作为资源 URL 的最终目标,除了微不足道的资源。使用 Restletsubclasses 是另一回事:附加 wraps 资源的 Filter还好。