【问题标题】:Servlet vs RESTfulServlet 与 RESTful
【发布时间】:2011-12-14 01:15:52
【问题描述】:

今天我读到了 Restful 服务。基本上我所理解的是,Restful webservices 将适用于 HTTP 请求方法,而不是普通的 webservice 将适用于 SOAP 请求。

因为普通的 servlet 也可以在 HTTP 方法上工作,所以需要什么 Restful 服务?

【问题讨论】:

    标签: jakarta-ee servlets jax-rs


    【解决方案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);
        }
    
    }
    

    那么您已经通过以下方式获得了正确格式的所需内容:

    就是这样。尝试对一个普通的普通 Servlet 做同样的事情 :) 请注意,SOAP 本质上通过 HTTP。它基本上是基于 HTTP 的额外 XML 层,而不是不同的网络协议。

    另见:

    【讨论】:

    • 感谢您的回复。那么由于编码效率的原因,只有 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】:

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

    1. REST Concept

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

    1. HTTP 协议 - Hypertext Transfer Protocol
    2. javax.servlet.http.HttpServlet
    3. REST with Java - JAX-RS 及其实现(如 Jersey 等)
    4. 其他不符合 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 集成。

      【讨论】:

        猜你喜欢
        • 2012-04-17
        • 2015-11-28
        • 1970-01-01
        • 2019-04-10
        • 2016-02-14
        • 2016-09-06
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多