【发布时间】:2011-12-14 01:15:52
【问题描述】:
今天我读到了 Restful 服务。基本上我所理解的是,Restful webservices 将适用于 HTTP 请求方法,而不是普通的 webservice 将适用于 SOAP 请求。
因为普通的 servlet 也可以在 HTTP 方法上工作,所以需要什么 Restful 服务?
【问题讨论】:
标签: jakarta-ee servlets jax-rs
今天我读到了 Restful 服务。基本上我所理解的是,Restful webservices 将适用于 HTTP 请求方法,而不是普通的 webservice 将适用于 SOAP 请求。
因为普通的 servlet 也可以在 HTTP 方法上工作,所以需要什么 Restful 服务?
【问题讨论】:
标签: jakarta-ee servlets jax-rs
RESTful 更像是一种架构风格,而不是一种不同的技术。从服务器的角度来看,它被设计为完全无状态的,并且在每个请求的基础上都是独立的(即没有没有会话)。从客户端的角度来看,它更像是一种通过带有(自记录)路径参数而不是请求参数的 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);
}
}
那么您已经通过以下方式获得了正确格式的所需内容:
就是这样。尝试对一个普通的普通 Servlet 做同样的事情 :) 请注意,SOAP 本质上也通过 HTTP。它基本上是基于 HTTP 的额外 XML 层,而不是不同的网络协议。
【讨论】:
@Resource, @GET, @POST 注释来做?在我的 REST 风格的应用程序中是否存在我会使用 @WebServlet 或 @WebFilter 的场景?
DataService 与 find 方法不是标准类,对吗?
DataResource 不是“标准类”。
在我看来,为了更好地理解,我们需要剖析让我们感到困惑的组件,而这些组件是,
Fielding 使用 REST 设计 HTTP 1.1 和统一资源标识符 (URI)
javax.servlet.http.HttpServlet类然后,如果您参考 this answer 来了解这些实现如何使用 Servlet(具体的 javax.servlet.http.HttpServlet)来拦截所有传入的请求。重要的引述,
这些 REST 服务类是简单的 POJO,经过注释可以告诉 jersey 框架关于不同的属性,如路径、消耗、 生产等。
然后您可以进一步阅读 -What is the difference between REST and HTTP protocols? 和 What is the difference between HTTP and REST? 并得出结论,如果您使您的 Web 服务 RESTFul,您将获得哪些优势,即(从一个答案复制),
REST 不一定与 HTTP 相关联。 RESTful Web 服务只是遵循 RESTful 架构的 Web 服务。
What is Rest -
1- Client-server
2- Stateless
3- Cacheable
4- Layered system
5- Code on demand
6- Uniform interface
What is the advantage of using REST instead of non-REST HTTP?
不过,我不想进行优缺点(优点和缺点)辩论,因为这是非常主观的。
有了以上的阅读,现在来回答你的问题,
需要什么 Restful 服务,因为普通的 servlet 也可以工作 关于 HTTP 方法?
您会理解 REST 框架只是简化了企业级 REST 服务的实现,但它们确实使用 HTTP Servlet 来拦截传入的请求。您始终可以使用普通的 servlet 来实现您自己的 REST 服务,但使用大量样板代码会更加耗时。
【讨论】:
RESTeasy 更容易用于 EJB 3.0 和 SEAM 集成,而 Jersey 更容易用于 Spring 和 JSON 集成。
【讨论】: