对Restful的理解
什么是Restful?
Restful是Roy Thomas Fielding这位大神在他的博士论文文中提出来。由于其超前的思想,在当时并未引起过多的注意。
直到近几年来,大概08年以后开始慢慢流行起来。
restful是一种设计思想。是Representational State Transfer的英文缩写:表现层状态转换或者表述型状态转换。这里省略了主语,是资源的表现型状态转换。
资源在网络中的体现就是URI。我们平时网上冲浪其实就是获取各种URI资源。获取的方式最简单的就是在浏览器地址栏输入URL。例如要访问百度资源:htttp://www.baidu.com
没有出现rest风格的时候,我们在编写javaweb程序时,例如要操作数据库里用户信息,我们的URL可以能会设计成:
http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息
而有了Restful风格后则设计为:
http://127.0.0.1/user/1 GET 根据用户id查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息
可以发现URI都是一样的,改变的只是客户端的请求方式而已,这就是restful风格的服务端无状态性(个人肤浅理解,更深入理解还需多实践才能懂得)。
Restful风格接口实现
@RestController
@RequestMapping("new/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询
* @param id
* @return
*/
@RequestMapping(value="{id}",method=RequestMethod.GET)
public ResponseEntity<User> queryUserById(@PathVariable Long id){
try {
User user=this.userService.queryById(id);
if (user == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
return ResponseEntity.status(HttpStatus.OK).body(user);
} catch (Exception e) {
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
/**
* 新增
* @param user
* @return
*/
@RequestMapping(method=RequestMethod.POST)
public ResponseEntity<Void> insertUser(User user){
try {
Boolean bool=userService.save(user)==1;
if (bool) {
return ResponseEntity.status(HttpStatus.CREATED).build();//HttpStatus.CREATED:201,build();没有返回值用build.
}
} catch (Exception e) {
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();//HttpStatus.INTERNAL_SERVER_ERROR:500
}
/**
* restful风格修改资源接口
* @param user
* @return void
*/
@RequestMapping(method=RequestMethod.PUT)
public ResponseEntity<Void> updateUser(User user){
try {
Boolean bool=userService.update(user)==1;
if (bool) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();//HttpStatus.NO_CONTENT:204,build();没有返回值用build.
}
} catch (Exception e) {
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
/**
* 删除
* @param id
* @return
*/
@RequestMapping(method=RequestMethod.DELETE)
public ResponseEntity<Void> deleteUser(long id){
try {
Boolean bool=userService.deleteById(id)==1;
if (bool) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
} catch (Exception e) {
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
HTTP响应状态码
响应结果示例
SpringMVC框架很强大,原生态的支持了restful风格
例如:@RequestMapping
@ResponseBody
@PathVariable
还没有评论,来说两句吧...