一 Roy Fielding
2000年Rest被Roy Fielding提出来的,我对Roy Fielding的印象有以下几个.
一是RoyFielding做为Http协议的起草者,在Http协议发布没多久跳起来说这个世界上很多人对于Http的使用是错误的,所以他说大家应该用Rest.
二是没多久RoyFielding做为Rest思想的启蒙者,在Rest被人接受并被广泛使用没多久跳起来说这个世界上很多人对Rest的使用是错误的..
所以我在PPT上选了柏拉图的一句话做为副标题,"思想永远是宇宙的统治者".
二 Rest
Rest本身的内容比我想象的多的多,大致列出来几个关键点如下:
1.满足以下的Constraints:
Client–server
Stateless
Cacheable
Layered system
Code on demand (optional)
Uniform interface
2.设计接口时候的原则
Identification of resources
Manipulation of resources through these representations
Self-descriptive messages
Hypermedia as the engine of application state
3.Rest希望实现的目标
Scalability of component interactions
Generality of interfaces
Independent deployment of components
Intermediary components to reduce latency, enforce security and encapsulate legacy systems
以上内容都摘自Wiki,稍微整理了一下.感觉以上的内容都很深刻,所以我简单的列出来了我认为理解Rest的重要的地方.
4.Rest对于我们来说
写道
Every Things is a Resource.
Every Resouce has a ID.
We Can Use Http Meothod(Get/Post/Put/Delete) Handle Resource.
简单说,再设计接口的时候,
第一个想到的是,我要提供的资源是什么.
第二个想到的是,这个资源的展现形式是什么.
第三个想到的是,这个资源上封装的操作是什么
我觉得这些就足够了.Rest和Soap比有太多的好处了,还有利于SEO(感谢搜索组的两位大神说到两点,一个是Url Path本身占的权重比Parameters高,一个是Url链接本身的权重就比较高.)
如果是设计一个键盘精灵的接口的话(之前博客中提到过键盘精灵,这里的主要的功能是查找拼音中以"Q"开头的产品列表),仿照前段时间四处流行的对比手法写出来三种不同风格的Url接口设计
写道
普通风格 /prompt/list.do?query=g&count=10&searchFrom=product
文艺风格
/prompt/product/g/10
2B风格 /?method=getProductPromt&query=g&count=10&searchFrom=product
这时候已经有很多人在争论Rest有没有用处,还有不少人在讨论Rest的适用场景了,还有人问到比较实际的问题,比如说多参数怎么解决.
我觉得Rest本身提供的是一种方式,怎么样让这种方式变得更艺术还真的取决于你怎么去使用他.设计Rest的接口更是一种艺术形式,最简单的例子,我要看一个人的某个时间段发表的文章列表,可能会有以下几种设计方式:
1. /person/xdyl/20000101-20000202
2. /person/xdyl/start/20000101/end/20000202
3./person/xdyl?start=20000101&end/20000202
4./person/xdyl/20000101/20000202/
哪种方式好就看个人喜好了吧.搜了一下SpringMVC也没看到有这种解决方案,之前还以为会有/{a}-{b}/这样的方式.
如果其他的朋友有好的解决方案还请多指点.
三 Spring MVC实现.
我觉得Spring MVC的实现很简单.大概牵涉到两个地方.
1.Spring 本身怎么支持从Path中获取变量的.
2.系统怎么区分一个请求应该被Spring拦截到还是应该被直接访问的静态资源
第一个问题很简单.贴段代码如下:
@Controller
@RequestMapping(value = "/contact")
public class ContactController {
private static final Log log = LogFactory.getLog(ContactController.class);
@RequestMapping(value = "/{contact}", method = RequestMethod.GET)
public String getContactdetail(@PathVariable Long contact, Model model) {
Contact c = this.contactService.getContact(contact);
if (c == null) {
c = new Contact();
}
model.addAttribute("code", 0);
model.addAttribute("contact", c);
return "/contact/detail/jmodel";
}
}
增删改查分别修改"method "以对应Http的四种方法(Post,Delete,Put,Get)就好了.
变量直接通过@PathVariable 就可以拿到.
第二个问题我理解起来也很简单.用UrlRewriter将所有的请求分成两种.动态请求加一个前缀"/app/",配置Spring的拦截器只拦截这种请求. 静态资源以前缀"/r/"开始,请求路径不变.
这样任何一个请求都会乖乖的分成两部分,是以"/r/"开始的就不会走Spring,不是以"/r/"开头全转成"/app/",交给Spring处理.
主要配置如下
web.xml 写道
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Spring只拦截/app/的请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
urlrewrite.xml 写道
<urlrewrite default-match-type="wildcard">
<rule>
<from>/r/**</from>
<to>/r/$1</to>
</rule>
<rule>
<from>/**</from>
<to>/app/$1</to>
</rule>
<outbound-rule>
<from>/app/**</from>
<to>/$1</to>
</outbound-rule>
</urlrewrite>
UrlRewrite可以用其它有同样功能的任意代替,Apache神马的最讨厌了.
最后附上我用到的UrlRewriter的Pom文件.不记得在哪儿看到的了,先贴上来再说.
pom.xml 写道
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>3.1.0</version>
</dependency>
Over,这个东西不是一个很详细的Spring配置说明.我记得第一次配的时候还是出了不少问题的.不过我觉得源码如果公开的话就什么问题都么有了~
等等看什么时候可以把Labs的源码公开了.
分享到:
相关推荐
9. Spring中的REST分页:这部分讲解了如何在Spring中实现REST API的分页功能,使得客户端可以更方便地处理大量的数据集。 10. 使用Spring处理REST错误:本节介绍了如何在Spring REST API中处理错误情况,包括错误的...
Spring Data REST Angular 示例项目是一个整合了Java Spring Boot框架与Angular前端框架的应用实例,展示了如何构建一个现代化的Web应用。这个项目旨在演示如何利用Spring Data REST将后端数据服务暴露为RESTful API...
**Spring 3.0 实现 REST 实例** 在软件开发中,REST(Representational State Transfer,表述性状态转移)是一种广泛采用的Web服务设计风格,它以简洁、灵活的方式提供了客户端与服务器之间的通信。Spring框架,...
"rest+spring+hibernate"这个主题结合了这三个关键技术,主要探讨如何在Spring框架中实现RESTful API,并利用Hibernate进行数据访问。 1. **RESTful API设计**:REST原则强调资源的表述和状态转移,通过HTTP动词...
这些内容是作者个人总结所的,主要描述了如何使用Spring MVC搭建Rest服务的全过程,并提供了整个搭建过程的源码。整个搭建过程中使用了Jetty、JAXB2.0和Spring等相关框架和技术,希望下载的人能够对这些技术有所了解...
本示例"rest webservice demo spring"是一个使用Spring框架实现的RESTful Web服务的演示项目。Spring是Java领域的一个开源框架,特别适合于构建企业级应用,它提供了全面的编程和配置模型,包括对REST的支持。 1. *...
【Spring CXF REST Demo】项目是一个使用Maven构建的Java应用程序,它展示了如何将Spring框架与Apache CXF集成,以创建RESTful风格的服务。在这个项目中,开发者可以学习到如何利用CXF作为服务端的REST服务提供者,...
**Spring 3.0 REST 实例详解** 在现代Web开发中,REST(Representational State Transfer,表述性状态转移)已经成为构建API的首选架构风格。Spring框架,作为一个强大的Java企业级应用开发框架,从3.0版本开始就...
### 构建基于Spring的REST服务 #### 一、概览与基础知识 在构建REST服务时,选择Spring作为开发框架是非常普遍的选择。Spring框架不仅功能强大且社区活跃,还提供了丰富的特性和工具来帮助开发者快速搭建高效的...
当CXF与Spring结合时,可以创建高效且灵活的REST接口,便于开发分布式系统。本篇将详细介绍如何利用CXF和Spring进行REST接口的开发。 首先,我们需要在项目中引入CXF和Spring的相关依赖。在Maven工程中,可以在pom....
在"spring mvc rest基础学习demo"中,我们将深入探讨如何使用Spring MVC构建RESTful API。 REST(Representational State Transfer,表现层状态转移)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以...
"Spring MVC REST Demo"是一个示例项目,旨在展示如何在Spring MVC框架中实现RESTful Web服务。下面将详细讨论Spring MVC与RESTful API的结合,以及如何创建和测试此类服务。 首先,Spring MVC是Spring框架的一部分...
这篇博客“基于Spring和Spring MVC实现可跨域访问的REST服务”深入探讨了如何使用这两个流行的Java框架来创建这样的服务。Spring作为核心框架提供依赖注入和整体架构支持,而Spring MVC作为其Web模块,专门用于构建...
在这个小例子中,我们将探讨如何使用Spring MVC来实现REST接口。 首先,让我们理解Spring MVC的基本架构。Spring MVC通过DispatcherServlet作为前端控制器,接收HTTP请求,然后根据请求映射找到相应的Controller...
REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,它基于HTTP协议,实现了资源的分布式管理和访问。本教程将通过一个简单的例子,讲解如何利用Spring MVC创建REST服务。 首先,...
本教程将通过一个名为"spring-mvc-demo"的项目,详细介绍如何使用Spring框架来实现RESTful Web服务。 一、Spring MVC与RESTful Web服务 Spring MVC是Spring框架的一部分,专门用于处理Web请求和响应。RESTful Web...
Spring 3.0 MVC 实现 REST 代码是一个关于构建基于 RESTful 风格的 Web 服务的示例。REST(Representational State Transfer)是一种架构风格,常用于设计网络应用程序,强调通过统一资源标识符(URI)来访问资源,...
- **Spring 3.2及之后**:从Spring 3.2开始,cglib被内置为Spring的一部分,不再需要单独添加依赖。 #### 1.3 Java-based Web Configuration - **使用Java配置**:相较于XML配置,Java配置提供了更简洁、更易于...