JavaEE 7教程

RESTful Web服务

  REST风格的Web服务被定义为JSR 339 ,以及完整的规范可以 下载
  REST是服务的一种利用Web标准的架构风格,其主要原则是:

  • 一切都可以被认定为一个资源,每个资源都可以被唯一 URI标识 。

  • 资源可以以多种格式来表示,由一个媒体类型定义。该 媒体类型将提供有关以何种格式满足产生的信息。标准方法是定义了客户端和服务器协商上资源的内容类型。

  • 使用标准的HTTP方法与资源进行交互:
    GET来检索资源,
    POST来创建资源,
    PUT来更新资源,
    DELETE键删除资源。

  • 客户端和服务端点之间的通信是无状态的。所有相关的 由服务器所需的状态是由客户端在每次调用时提交。

  REST风格的Web服务( JAX-RS )的Java API定义了一个标准的注解驱动的API, 这可以帮助开发人员在Java中构建RESTful Web服务并调用它。

 

资源Resouce

   以@Path:标注:

@Path("orders")
public class OrderResource {
@GET
public List<Order> getAll() {
//. . .
}
@GET
@Path("{oid}")
public Order getOrder(@PathParam("oid")int id) {
//. . .
}
}
@XmlRootElement
public class Order {
int id;
//. . .
}

  • OrderResource是一个POJO类,并发布为REST风格的资源,用@ Path注释。
  • Order类标有@ XmlRootElement注释,允许Java和XML转换
  • 该getAll方法,它提供了所有订单的列表,我们访问使用HTTP GET方法这个资源调用这个方法。 使用@ GET注释。
  • GetOrder方法上的@ Path注释标记为一个子资源,可以使用orders/{OID}访问。
    OID的大括号将它作为模板参数并绑定其值
    在运行到传入GetOrder方法的id参数。
  • @ PathParam也可以用于模板参数绑定到一个资源类字段。

通常情况下,一个RESTful资源连同其他类和 资源被绑定在一个.war文件。 Application类和@ ApplicationPath注解用于指定在打包封存所有的RESTful资源的 基本路径。应用类还提供有关应用程序的额外的元数据。

假设上面这个类打包在store.war 文件,部署在localhost:8080,Application类如下:

@ApplicationPath("webresources")
public class ApplicationConfig extends Application {
}

获得所有订单列表getall访问:

http://localhost:8080/store/webresources/orders

获得某个订单:
http://localhost:8080/store/webresources/orders/1

值1将被传递给是GetOrder的方法参数ID。资源方法将找到正确的订单号码,并返回结果,这个结果是Order类,以@ XmlRootElement注释,使用JAXB将 Java转换到XML,返回XML表示形式

一个URI可以通过使用名称/值对HTTP查询参数。你可以映射这些 资源方法的参数或使用@ QueryParam注释字段。

public List<Order> getAll(@QueryParam("start")int from,
@QueryParam("page")int page) {
//. . .
}

可以被如下URL访问:

http://localhost:8080/store/webresources/orders?start=10&page=20

一个资源的方法在JAX-RS实现之前必须等待然后产生一个响应返回给客户端。 JAXRS 2允许异步实现, 其做法是先暂停该客户端的连接,后来响应可用恢复到这个连接。

@Path("orders")
public class OrderResource {
 @GET
 public void getAll(@Suspended final AsyncResponse ar) {
  executor.submit(new Runnable() {
  @Override
  public void run() {
   List<Order> response = new ArrayList<>();
    //. . .
   ar.resume(response);
  }
 });
}
}

  • 该getAll方法方法被标记为产生一个异步响应。方法参数使用新注入的类AsyncResponse的
    注释@Suspended。这个方法的返回类型为void。
  • 此方法派生一个新线程,如使用 ManagedExecutorService作为Java EE的定义的并发实用程序。客户端连接 在这个时候被暂停。
  • 新的线程执行长时间运行的操作,完成后恢复连接,当准备就绪, 通过调用resume恢复连接

可以通过注册CompletionCallback:一个实现获得完成的事件。

public class OrderResource {
public void getAll(@Suspended final AsyncResponse ar) {
ar.register(new MyCompletionCallback());
}
class MyCompletionCallback implements CompletionCallback {
@Override
public void onComplete(Throwable t) {
//. . .
}
}
}

当异步请求完成时,回调触发onComplete。

也可以通过注册ConnectionCallback:获得连接相关事件。

public class OrderResource {
public void getAll(@Suspended final AsyncResponse ar) {
ar.register(new MyCompletionCallback());
}
class MyCompletionCallback implements CompletionCallback {
@Override
public void onDisconnect(AsyncResponse ar) {
//. . .
}
}
}

下页

 

REST架构

JavaEE教程

Java学习心得