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 也是一个快速澄清,在您的示例中,DataServicefind 方法不是标准类,对吗? @agks:呃,不。这只是您的业务服务类,就像 DataResource 不是“标准类”。【参考方案2】:

在我看来,为了更好地理解,我们需要剖析让我们感到困惑的组件,而这些组件是,

    REST Concept

Fielding 使用 REST 设计 HTTP 1.1 和统一资源标识符 (URI)

    HTTP 协议 - Hypertext Transfer Protocol javax.servlet.http.HttpServletREST 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的主要内容,如果未能解决你的问题,请参考以下文章

RESTful简单介绍

servlet的配置信息与执行过程

与Servlet相关的接口

在 servlet 过滤器中,如何确定哪个 servlet 与 URL 匹配?

Servlet学习之Servlet概念与运行流程

Servlet生命周期与工作原理