RestFul是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的一种代码编写风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
REST 来自于Roy Thomas Fielding 2000年的博士论文 - 《Architectural Styles and the Design of Network-based Software Architectures》
restful风格实现的机制有多种,常见的有RPC和基于web的服务
在Restful风格中,用户发起请求的发送方式有:get,post,delete,put…等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。
在Restful风格中,现有规定如下:
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。
POST(CREATE):在服务器新建一个资源,调用insert操作。
PUT(UPDATE):在服务器更新资源,调用update操作。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。(目前jdk7未实现,tomcat7也不行)。
DELETE(DELETE):从服务器删除资源,调用delete语句。
他会对url进行规范:
a) 非REST风格的url:localhost:8080/springmvc?name=小白&password=123;
b) REST风格的url:localhost:8080/springmvc/小白/123;
分析:
直观上看是不是比较简洁
看不懂:隐藏了参数名称,安全,防止被攻击
所有的url都可以当成是资源
对http的方法进行规范
a)不管是删除,添加,更新….使用的url都是一致,那么如果需要删除,就把http的方法设置删除delete
b) 控制器:通过判断http的方法来执行操作(增删改查)
目前这种做法还没有被广泛采用
* 1.路径的变化:/hello_rest/{name}/{password}其中{}相当于可以添加的动态的参数,
* 也可以将工程名写在后面:/{name}/{password}/hello_rest
* 2.参数的写法:需要利用@PathVariable("name")来匹配上面的参数,这样才可以取到值
* 3.至于@PathVariable后面跟的形参你就可以随便命名了
* @param username
* @param password
* @return
*/
@RequestMapping(value = "/hello_rest/{name}/{password}")
//@RequestMapping(value = "/{name}/{password}/hello_rest")
public String hello_rest(@PathVariable("name") String username,
@PathVariable("password") String password) {
if("admin".equals(username)&"123".equals(password)){
System.out.println("登录成功");
return "hello";
}
return "hello";
}
访问路径:localhost:8080/工程名/hello_rest/xx/xx(其中xx就是你随便填写的内容,它会匹配到后台的name和password的值)
比如:
你输入的路径是:localhost:8080/工程名/hello_rest/小白/admin
后台会匹配到:name=“小白”,password=“admin”
使用到的注解:
@Controller:修饰class,用来创建处理http请求的对象
@RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
@RequestMapping:配置url映射,在Spring 4.3 之后,为了更好的支持 RESTful 风格,增加了几个注解:@PutMapping、@GetMapping、@DeleteMapping、@PostMapping,其实也就是将 method 属性的值与 @RequestMapping 进行了绑定而已。
下面我们尝试使用Spring MVC来实现一组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参。
public class User {
private Long id;
private String name;
private Integer age;
// 省略setter和getter
}
@RestController
@RequestMapping(value="/users") // 通过这里配置使下面的映射都在/users下
public class UserController {
// 创建线程安全的Map
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
// @RequestMapping(value="/", method=RequestMethod.GET)
@GetMapping("/")
public List<User> getUserList() {
// 处理"/users/"的GET请求,用来获取用户列表
// 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递
List<User> r = new ArrayList<User>(users.values());
return r;
}
//@RequestMapping(value="/", method=RequestMethod.POST)
@PostMapping("/")
public String postUser(@ModelAttribute User user) {
// 处理"/users/"的POST请求,用来创建User
// 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数
users.put(user.getId(), user);
return "success";
}
//@RequestMapping(value="/{id}", method=RequestMethod.GET)
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 处理"/users/{id}"的GET请求,用来获取url中id值的User信息
// url中的id可通过@PathVariable绑定到函数的参数中
return users.get(id);
}
//@RequestMapping(value="/{id}", method=RequestMethod.PUT)
@PutMapping("/{id}")
public String putUser(@PathVariable Long id, @ModelAttribute User user) {
// 处理"/users/{id}"的PUT请求,用来更新User信息
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
//@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
// 处理"/users/{id}"的DELETE请求,用来删除User
users.remove(id);
return "success";
}
}
我们通过创建User实体类,再来实现对实体类对象的操作接口,使用@PutMapping、@GetMapping、@DeleteMapping、@PostMapping这四个注解来完成对@RequestMapping 和method属性值的绑定(这是Spring 4.3 之后,为了更好的支持 RESTful 风格,增加了几个注解),并且通过 @PathVariable 注解来将 HTTP 请求中的属性绑定到我们指定的形参上。
这样,在开发的过程中我们就可以使用统一的接口地址,传递不同的参数配合不同的请求方式即可实现不同的方法调用,实现不同的功能,怎么样?是不是更简洁,更安全了。