一、Rest的基本原理 (表述性状态转移) rest 与 rpc没有任何关系。RPC是面向服务的,并关注于行为和动作,而REST是面向资源的。
1: 表述性,资源实际上可以用各种形式来进行表述。xml,json,html
2: 状态当使用REST的时候,我们更关注资源的状态
3: REST涉及转移资源数据,它以表述性形式从一个应用转移到了一个应用
总结:rest就是将资源的状态以最合适的形式从服务器端转移到客户端。
二、spring 如何支持rest :
1、控制器可以处理所有的http 方法 , get、put、delete、post
2、新的pathvariable 注解使得控制器能处理参数化的URL
3、spring的表单绑定jsp标签库的<form:form>标签以及新的HiddenHttpMethondFilter, 使得通过html表单提交put 和 delete 请求成为可能。
4、通过使用spring的视图和视图解析器,资源可以以各种形式进行表述。xml,json,atom和rss
5、可以使用新的contentnegotiatingviewresolver 来选择最合适客户端
6、基于视图的渲染可以使用@responsebody注解
7、新的@responsebody注解以及httpmethodconverter实现可以传入http数据转化为控制器处理方法
8、resttemplate简化了客户端对rest资源的使用。
restful 和 restless 的url 和 控制器
rest less 的 url 和 控制器
1、restless的url : http://localhost:8080/Spitter/displaySpittle.htm?id=123
2、
@Controller
@RequestMapping(“/displaySpitle.html”)
public class DisplaySpittleController {
private final SpitterService spitterService ;
@Inject
public DisplaySpittleController(SpitterService spitterService){
this. spitterService = spitterService
}
@RequestMapping(method = RequestMethod.GET)
public string show spittle(@RequestParam(“id”) long id , Model model)
{
model.addAttribute(spitterService.getSpittleByid(id))
return “spitter/view”
}
}
restful的url和 控制器
1、http://localhost:8080/Spitter/spittles/123
2、
@Controller
@RequestMapping(“/spittles”)
public class SpittleController {
private SpitterService spitterService;
@Inject
public SpittleController(SpitterService spitterService){
this.spitterService = spitterService;
}
@RequestMapping(value = “/{id}” method = RequestMethod.GET)
public String getSpittle(@PathVariable(“id”) long id , Model model){
model.addAttribute(spitterService.getSpittleById(id));
return “spittles/view”
}
}
rest 动作
1、对于任意i给定的资源,最常见的操作是在服务器上对资源进行创建,索引,更新,删除
2、每个http方法具有两个特性,安全性和幂等性。
3、http提供了多个方法来操作资源
安全: 不改变资源状态
幂等: 一次请求和多次请求具有相同的作用
GET方法: 执行读取操作。是安全,是幂等。
POST方法:通常用于更新和创建操作。不安全,不幂等。
PUT方法: 通常用于更新和创建操作。不安全,幂等
DELELE方法: 删除操作,不安全,幂等
OPTIONS方法: 请求与服务器通信可用的选项,是安全,是幂等
HEAD方法: 类似GET,只返回头部信息 是安全,是幂等
TRACE 方法: 将请求体的内容 是安全,是幂等
4、使用PUT更新资源
get 请求将资源的状态从服务器转移到客户端,而put将资源的状态从客户端转移到服务器上。
@RequestMapping(value="/{id}",method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void putSpittle(@PathVariable("id") long id , @Valid Spittle spittle){
spitterService.saveSpittle(spittle);
}
5、处理Delete请求: RequestMethod.delete
6、使用post创建资源 : 可以完成其他http方法无法完成的工作
方法的requestmapping没有value的时候,匹配类的value
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody Spittle createSpittle(@Valid Spittle spittle,BindingResult result,HttpServleResponse response){
if(result.hasErrors()){
throw new BindException();
}
spitterService.saveSpittle(spittle);
response.setHeader("Location"," /spittles/" + spittle.getId()+"");
return spittle
}