一、关于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
大功告成~~~ 撒花~~~