今天我读到了有关 Restful 服务的内容。基本上我的理解是 Restful Web 服务将在 HTTP 请求方法上工作,而不是普通的 Web 服务将在 SOAP 请求上工作。
普通 servlet 也可以在 HTTP 方法上工作,所以需要 Restful 服务吗?
请您参考如下方法:
RESTful 与其说是一种不同的技术,不如说是一种架构风格。从服务器的角度来看,它被设计为完全无状态并且基于每个请求是独立的(即没有 session )。从客户端的角度来看,它更像是一种通过带有(自文档化)路径参数而不是请求参数的 URL 获取不同格式信息的方法。
当然,您可以使用普通的 servlet 来完成此操作,但它会引入一些样板代码来收集路径参数并生成所需的响应。 JAX-RS 只是一个方便且自包含的 API,它消除了您自己编写所有样板代码的需要,从而产生最少且更多的自文档化代码。
假设您有一个 JAXB 实体作为模型,如下所示:
@XmlRootElement
public class Data {
@XmlElement
private Long id;
@XmlElement
private String value;
// ...
@Override
public String toString() {
return String.format("Data[id=%d,value=%s]", id, value);
}
}
JAX-RS 资源如下:
@Path("data")
public class DataResource {
@EJB
private DataService service;
@GET
@Path("text/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getAsText(@PathParam("id") Long id) {
return String.valueOf(service.find(id));
}
@GET
@Path("xml/{id}")
@Produces(MediaType.APPLICATION_XML)
public Data getAsXml(@PathParam("id") Long id) {
return service.find(id);
}
@GET
@Path("json/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Data getAsJson(@PathParam("id") Long id) {
return service.find(id);
}
}
然后您就可以通过以下方式获得正确格式的所需内容:
- http://example.com/rest/data/text/123
- http://example.com/rest/data/xml/123
- http://example.com/rest/data/json/123
就是这样。尝试对单个普通 Servlet 执行相同的操作:) 请注意,SOAP 本质上也通过 HTTP 进行。它基本上是 HTTP 上的额外 XML 层,而不是不同的网络协议(protocol)。