Servlet 与 RESTful
Posted
技术标签:
【中文标题】Servlet 与 RESTful【英文标题】:Servlet vs RESTful 【发布时间】:2011-12-14 01:15:52 【问题描述】:今天我读到了 Restful 服务。基本上我所理解的是,Restful webservices 将适用于 HTTP 请求方法,而不是普通的 webservice 将适用于 SOAP 请求。
因为普通的 servlet 也可以在 HTTP 方法上工作,所以需要什么 Restful 服务?
【问题讨论】:
【参考方案1】: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);
那么您已经通过以下方式获得了正确格式的所需内容:
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 层,而不是不同的网络协议。
另见:
REST tutorial JAXB tutorial Jersey tutorial【讨论】:
感谢您的回复。那么由于编码效率的原因,只有 Restful 服务才能发挥作用? 不完全是这样,你也可以对普通的 servlet 做同样的事情。现有的 JAX-RS API 只是最小化了样板。 Restful 更多的是关于 URL 格式。它允许您基于 URL 路径而不是请求参数执行操作。 @BalusC 一如既往地感谢您的精彩回答。您能否通过确认我的假设来帮助我,即如果我正在构建一个 REST 样式的应用程序,那么 servlet 对我来说已经过时了? IE。几乎我可以用 servlet 做的任何事情都可以用 POJO +@Resource, @GET, @POST
注释来做?在我的 REST 风格的应用程序中是否存在我会使用 @WebServlet
或 @WebFilter
的场景?
@BalusC 也是一个快速澄清,在您的示例中,DataService
与 find
方法不是标准类,对吗?
@agks:呃,不。这只是您的业务服务类,就像 DataResource
不是“标准类”。【参考方案2】:
在我看来,为了更好地理解,我们需要剖析让我们感到困惑的组件,而这些组件是,
-
REST Concept
Fielding 使用 REST 设计 HTTP 1.1 和统一资源标识符 (URI)
-
HTTP 协议 -
Hypertext Transfer Protocol
javax.servlet.http.HttpServlet
类
REST with Java - JAX-RS 及其实现(如 Jersey 等)
其他不符合 JAX-RS 的 REST 实现(如 Spring REST)
Difference between JAX-RS and Spring Rest
然后,如果您参考 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 服务,但使用大量样板代码会更加耗时。
【讨论】:
【参考方案3】: RESTeasy 有一个专有的@Form,它将表单参数(例如,HTTP 正文中的 [BuildVersion]&[BuildVersion]...)绑定到 Java 对象。如果您正在处理表单内容,则将@formparam 绑定到Java 对象将节省大量精力 RESTeasy 用于 URL 或查询的专有缓存RESTeasy 更容易用于 EJB 3.0 和 SEAM 集成,而 Jersey 更容易用于 Spring 和 JSON 集成。
【讨论】:
以上是关于Servlet 与 RESTful的主要内容,如果未能解决你的问题,请参考以下文章