一、RESTful 是什么?
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
二、RESTful的特点?
1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
三、RESTful与HTTP的区别?
操作 | 传递HTTP方式 | RESTful请求 |
---|---|---|
查询 | GET [/user?id=1] | GET [/user/1] |
添加 | POST [/user/add(name=xx&age=21)] | POST [/user json(k=v)] |
更新 | POST [/user/update (name=xx&age=22)] | PUT [/user json(k=v)] |
删除 | POST [/user/del?id=1] | DELETE [/user/1] |
总结:
- 将网络上所有的内容描述成一种资源(图片、文件、用户数据…)
- 使用http请求方法描述动作 GET表示查询、post表示添加、put表示更新、delete表示删除
- 传参尽量使用json,但是并不是只能使用json
四、如何在spring mvc中使用RESTful请求?
spring mvc提供了 HiddenHttpMethodFilter 过滤器用于将POST请求转成PUT、 DELETE等请求。
具体操作步骤:
- 在配置文件web.xml中配置HiddenHttpMethodFilter
- 在form表单中写一个隐藏域,name属性值是_method,value就是请求方法(PUT、 DELETE)
- 在Controller中,需要使用注解来标识请求和方法。
@RestController:由@Controller + @ResponseBody组成
@PathVariable :映射 URL 绑定的占位符,举例:
//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/user/{id}")
public String testPathVariable(@PathVariable("id") Integer id)
{
System.out.println("user:"+id);
return SUCCESS;
}
这里在@RequestMapping()注解中,将路径中的一部分用{ }直接括了起来,括起来的部分,就是请求地址中的相同位置的那部分,例如:
http://loclhost:8080/user/1
,此时这个地址会被@RequestMapping("/user/{id}") 注解抓取到,那么此时,根据相同位置,此时 {id} 的值就是 1。而我们又在下面的方法参数列表中使用了@PathVariable(“id”)注解,表示的意思就是上面@RequestMapping()注解中{}中的那么内容,直接映射到被@PathVariable注解修饰的变量中,那么此时@PathVariable()括号中指定的value是“id”,与上面@RequestMapping中 { } 括住的内容同名,都是id,那么上面的id的值就会映射到下面的这个@PathVariable(“id”)修饰的 Integer类型的 id变量中,所以Integer类型的id变量的值,就变成了@RequestMapping()中,被 { } 括住的那部分的值。
这里需要特别注意,{ } 括住的部分需要与 @PathVariable()括号中的部分 保持名称一致,而被@PathVariable修饰的变量原则上可以是任何的名字,不过我们在实际开发中,会将这三部分的值都统一成相同的值。
五、具体代码演示springmvc中RESTful请求
后端:
@RestController
public class TestRestController {
@GetMapping("/user/{id}")
//@PathVariable 的 参数名称需要跟上面{}中的参数名称完全一致
public User queryById(@PathVariable("id") int id){
System.out.println("id:"+id);
User user = new User();
user.setId(id);
user.setName("尼古拉");
user.setAge(20);
return user;
}
/**
* 在被@RestController注释修饰后,如果要返回页面,只能使用ModelAndView作为返回值
* @param user
* @return
*/
@PutMapping("/user") //更新用户
public ModelAndView updataUser(User user){
System.out.println(user);
/**
* 此时的ModelAndView是请求转发进行页面跳转的,而此时Put请求没有办法使用请求转发到页面的。所以会报错。
*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("hello"); //指定返回的页面名称
modelAndView.addObject("result","测试REST请求"); //传参数
return modelAndView;
}
}
注意,上述代码中举例了GET请求和PUT请求,使用GET请求查询内容,使用PUT请求修改内容。通常,还有DELETE请求删除内容,POST请求增加内容。这些请求都有对应的拦截路径的注解,@PutMapping、@GetMapping、@PostMapping、@DeleteMapping。这四个注解其实就是@RequestMapping中又定义了method属性,只不过将它们单独分离了出来,更加方便使用。
前端:
由于前端页面form表单发送请求时,仅能为post或者get类型的请求。没有办法发送REST请求,此时,springmvc就会与开发者有一个约定,那就是它会根据一个信号来自动帮助我们进行请求方式的转化。这个信号标志就是:Form表单必须发送POST请求,并且,创建一个hidden隐藏域来存放一个name为_method,value为指定REST类型的请求名称即可。
代码举例:
<form action="${pageContext.request.contextPath}/user" method="post">
<%--value 大小写都可以--%>
<input type="hidden" name="_method" value="put" />
id: <input type="number" name="id" /> <br>
name: <input type="text" name="name" /> <br>
age: <input type="number" name="age" /> <br>
<input type="submit" value="更新" />
</form>
代码中,form的method请求必须写post,表单中添加了一行<input type="hidden" name="_method" value="put" />
,这就是hidden隐藏域,name的值必须是“_method”,value是需要转成的REST类型请求。
那按照这样的写法,就是我们给spring mvc发送的信号标志,它在接收到以后,就会自动为我们进行请求类型的转化,而转化的过程,默认情况下,springmvc是做不到的,它需要我们在配置文件中做一下简单的配置,那就是配置一下HiddenHttpMethodFilter过滤器,用来转换REST请求。
配置:
需要在web.xml配置文件中添加如下代码:
<filter>
<filter-name>rest</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>rest</filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
如此配置后,就可以过滤指定的请求了,由于我们<url-pattern>
配置的是/*,所以就是所有的请求都会被过滤器拦截,用于查看是否存在我们的信号标志,如果有就为我们转化,如果没有就什么也不做。如此以来,前端就可以发送REST请求了,而后端在spring mvc的帮助下,也可以精准的拦截到指定的请求,用于处理。