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 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 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 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) {
//. . .
}
}
}