REST调查资料整理

一、关于REST

       REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

 它基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格。特征如下:
 1、网络上的资源都被抽象为资源,这些资源都具有唯一的统一资源标识符(URI:Uniform Resource Identiter),这些资源都是自我们描述的。这些资源使用HTTP内容标头类型指定。如:XML、JSON、HTML、PNG等。

 2、服务的使用者通过HTTP协议的标准动作(Get、Put、Post、Delete)通过统一的接口对资源进行操作。
 3、对资源进行的操作不会改变它的URI。
 4、客户端、服务端之间的交互是没有状态的。由于这种无状态行,服务端不需要为每个客户端维护Context。

     如果一个架构符合REST原则,就称它为RESTful架构。就是说REST是一种风格。

二、REST主要应用领域

           REST主要应用在SOA(Service-Oriented Architecture)——面向服务的体系结构和云存储方面。

1. SOA与REST的共同点:
   1)统一的服务契约接口与服务接口
   2)松散的耦合。
   3)只要有权限都可以进行访问

2. 云存储服务与REST:

以下内容摘自http://www.ibm.com/developerworks/cn/cloud/library/cl-cloudstorage/index.html

访问方法

      云存储与传统存储之间最显著的差异之一是其访问方法(参见 下图)。大部分提供商实现多个访问方法,但是 Web 服务 APIs 是常见的。许多 APIs 是基于REST 原则实现的,即在 HTTP 之上开发(使用 HTTP 进行传输)的一种基于对象的方案。REST APIs 是无状态的,因此可以简单而有效地予以提供。许多云存储提供商实现 REST APIs,包括 Amazon Simple Storage Service (Amazon S3)、Windows Azure™ 和 Mezeo Cloud Storage Platform。

      Web 服务 APIs 的一个问题是,它们需要与应用程序集成,以利用云存储。因此,对云存储也使用常见的访问方法来提供即时集成。例如,NFS/Common Internet File System (CIFS) 或 FTP 等基于文件的协议,iSCSI 等基于块的协议。Nirvanix、Zetta 和 Cleversafe 等云存储提供商提供这些访问方法。

      尽管上面提到的协议是最常用的,但也有适合云存储的其他协议。最有趣的其中一个是基于 Web 的分布式创作与版本控制(WebDAV)。WebDAV 也基于 HTTP,且将 Web 作为一种可读写的资源加以启用。WebDAV 的提供商包括 Zetta 和 Cleversafe 等。

云存储访问方法

三、REST具体应用

      1. REST简单例子(无后缀名)

/blog/1  HTTP GET =>    得到id = 1的blog
/blog/1  HTTP DELETE => 删除 id = 1的blog
/blog/1  HTTP PUT  =>   更新id = 1的blog
/blog     HTTP POST =>   新增BLOG

       2. REST风格架构目前主要应用于资源导向型网站,如

       大众点评网http://www.dianping.com/shanghai/food

       一号店http://www.yihaodian.com

       的资源检索部分采用的即为REST风格架构。

四、REST具体实现

      1. Struts2与Spring MVC3都支持REST架构,详细示例见以下两篇博文:

          Struts2整合REST Plugin http://shelltea.iteye.com/blog/471813

          Spring RESThttp://www.cnblogs.com/hoojo/archive/2011/06/10/2077422.html

      2. HTTP方法

          幂等性:指多个相同请求返回相同的结果。

1)PUT:更新资源数据,如果资源不存在的话,则根据此URI创建一个新的资源。具有幂等性

2)POST方法:通常表示“创建一个新资源”,也能被用于调用任意过程,因而它既不安全也不具有幂等性

3)GET方法:检索一个资源,具有幂等性

4)DELETE方法删除一个资源,直到该资源不存在,具有幂等性

      3. 交互过程

1) web浏览器和web服务器的交互过程

例:用户访问页面 http://localhost:8080/restSpring/restful/new,浏览器与服务器的信息交互过程如下:

(1)浏览器向DNS获取web服务器(即tomcat服务器)的IP地址localhost(即127.0.0.1);

(2)浏览器与IP地址为127.0.0.1的服务器进行TCP连接,端口为8080;

(3)浏览器执行HTTP协议,发送GET /restSpring/restful/new HTTP/1.1命令,请求读取该文件;

   [注:详细过程见 2).spring mvc3实现REST的后台处理过程]

(4) tomcat服务器服务器返回/restSpring/restful/new文件到客户端;

(5)释放TCP连接;

(6)浏览器解释/restSpring/restful/new文件内容,并显示该文件表示的页面。

2) spring mvc3实现REST的后台处理过程

spring mvc3采用基于注解的方式实现REST。 

(1)tomcat服务器找到部署在其上的工程restSpring; 

(2)找到 WEB-INF/web.xml中配置的servlet信息,再找到contextConfigLocation中配置的WEB-INF/dispatcher.xml文件;

 <servlet>       

   <servlet-name>dispatcher</servlet-name>       

   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>       

   <init-param>           

    <param-name>contextConfigLocation</param-name>           

     <param-value>/WEB-INF/dispatcher.xml</param-value>       

   </init-param>       

   <load-on-startup>1</load-on-startup>   

  </servlet>

(3)找到dispatcher.xml文件中配置的 annotation默认的方法映射适配器——handlerMapping,激发注解;

<bean id="handlerMapping"

class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">       

   <property name="order" value="1" />   

 </bean> 

 (4)找到dispatcher.xml文件中配置的<context:component-scan/>信息,扫描Controller类——RESTController.java

<context:component-scan base-package="com.**.controller"/>   

(5)找到RESTController.java中的注解@RequestMapping("/restful");

(6)找到RESTController.java中的注解@Controller,在其对应的class RESTController中找到@RequestMapping(value = "/new", method = RequestMethod.GET);

@RequestMapping(value = "/new", method = RequestMethod.GET)  

  public String  newUser(){

   return "new";

}

(7)根据返回的字符串”new”,返回dispatcher.xml,查找对应的视图配置 

<bean id="viewResolver"

     class="org.springframework.web.servlet.view.InternalResourceViewResolver">

         <property name="viewClass"

          value="org.springframework.web.servlet.view.InternalResourceView" />

         <property name="prefix" value="/WEB-INF/pages/" />

         <property name="suffix" value=".jsp"></property>

     </bean>

得到返回待返回文件的路径/WEB-INF/pages/new.jsp

       4. 关于HTTP方法——POST, PUT, GET, DELETE 方法的实现

1)RESTController.java

 @RequestMapping("/restful")

 @Controller   

public class RESTController { 

           //显示所有数据    

           @RequestMapping(value = "/show", method = RequestMethod.GET)   

           public ModelAndView show() {       

                 System.out.println("show");       

                 ModelAndView model = new ModelAndView("xStreamMarshallingView");       

                 model.addObject("show method");        

                 return model;    

           }  

          //根据id取数据                

           @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)  

           public ModelAndView getUserById(@PathVariable String id) {       

                 System.out.println("getUserById-" + id);       

                 ModelAndView model = new ModelAndView("xStreamMarshallingView");       

                 model.addObject("getUserById method -" + id);      

                 return model;   

           }   

          //跳转到new.jsp        

           @RequestMapping(value = "/new", method = RequestMethod.GET)  

           public String  newUser(){

                 return "new";

           } 

         //新增数据  

           @RequestMapping(value = "/add", method = RequestMethod.POST)   

           public ModelAndView addUser(String user) {       

                 System.out.println("addUser-" + user);       

                 ModelAndView model = new ModelAndView("xStreamMarshallingView");       

                 model.addObject("addUser method -" + user);      

                 return model;    

           }       

          //编辑数据

           @RequestMapping(value = "/edit", method = RequestMethod.PUT)   

           public ModelAndView editUser(String user) {      

                 System.out.println("editUser-" + user);       

                 ModelAndView model = new ModelAndView("xStreamMarshallingView");       

                 model.addObject("editUser method -" + user);      

                 return model;   

           }      

           //根据id删除数据

           @RequestMapping(value= "/remove/{id}", method = RequestMethod.DELETE)   

           public ModelAndView removeUser(@PathVariable String id) {       

                 System.out.println("removeUser-" + id);       

                 ModelAndView model = new ModelAndView("xStreamMarshallingView");       

                 model.addObject("removeUser method -" + id);       

                 return model;   

           }          

}

2)浏览器不支持put,delete等method方法的解决方案

浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。

 在web.xml中添加如下代码:

 <!--浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>

new.jsp代码如下:

<form action="/restSpring/restful/add" method="POST">

      <p>this is add form</p>

      <input type="text" name="user" />

      <input type="submit" value="Add" />

</form>

<form action="/restSpring/restful/edit" method="POST">

      <p>this is edit form</p>

      <input type="text" name="user" />

      <input type="submit" name="_method" value="put" />

</form>

<form action="/restSpring/restful/remove/111" method="POST">

      <p>this is delete form</p>     

      <input type="submit" name="_method" value="delete" />

</form>

五、部署运行

          1. 将工程导入eclipse

       2. 添加tomcat属性

                   工程(右键)——> tomcat project——> update context

       3. 启动tomcat

       4. 在浏览器中输入http://localhost:8080/restSpring/restful/new  检测页面是否能够被显示。

      工程下载地址: http://download.csdn.net/detail/ziyifengfei/4769891

大功告成~~~   撒花~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值