RESTful风格阐述
REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用。主要特点是方法信息存在于HTTP协议的方法中(GET,POST,PUT,DELETE),作用域存在于URL中。例如,在一个获取设备资源列表的GET请求中,方法信息是GET,作用域信息是URI中包含的对设备资源的过滤、分页和排序等条件 良好的REST API不需要任何文档
REST风格资源路径REST风格的资源路径设计是面向资源的,资源的名称应该是准确描述该资源的名词。
资源路径概览:
sheme://host:port/path?queryString例:http://localhost:8080/bywlstudio/users?username=xiuer&id=1
HTTP方法
GET用于读取、检索、查询、过滤资源PSOT用于创建一个资源PUT用于修改、更新资源、创建客户端维护主键信息的资源DELETE用于删除资源
资源地址和 HTTP方法结合在一起就可以实现对资源的完整定位
RESTful风格 API设计上文讲述了通过HTTP方法和资源路径对服务器的一个资源进行定位的过程
接下来看一个REST风格 API的设计
POST/users
PUT/users{id}
[^创建客户端维护主键信息的资源]可以看到通过这个 RESTAPI都是通过对同一个资源==的操作,所不同的就是通过不同的HTTP方法来实现对资源不同的处理。
MVC对 REST的支持@Controller声名一个处理请求的控制器@RequestMapping请求映射地址,它存在几个子注解对于实现 REST风格来说更加具有语义性@GETMapping GET请求@PUTMapping PUT请求@POSTMapping POST请求@DELETEMapping DELETE请求@ResponseBody 将响应内容转换为 JSON格式@RequestBody 请求内容转换为 JSON格式@PathVariable("id")用于绑定一个参数@RESTController 等同于 @Controller+ @ResponseBody在类上写了这个注解,标识这个类的所有方法只返回数据,而不进行视图跳转HTTP状态码REST风格 API一个最鲜明的特点通过返回对应的 HTTPStatus来判断客户端的操作是否完成
下面是spring中关于 Http状态码描述的枚举类,本文列举了常见的状态码(读者若对此感兴趣可以查看 HttpStatus源码)
public enum HttpStatus{ OK(200, "OK"),//用于服务器有实体响应 CREATED(201, "Created"),//创建了新实体,响应该实体 NO_CONTENT(204, "No Content"),//服务器正常响应,但无实体响应 BAD_REQUEST(400, "Bad Request"),//客户端请求语法错误 NOT_FOUND(404, "Not Found"),//目标资源不存在 INTERNAL_SERVER_ERROR(500, "Internal Server Error"),//服务器内部错误 NOT_IMPLEMENTED(501, "Not Implemented"),//服务器不支持当前请求}Spring返回状态码是通过 @ResponseStatus注解或者 ResponseEntity<?>类实现的。
@ResponseStatus方式
@GetMapping(path = "/user/{id}" , produces = "application/json;charset=utf-8")@ResponseStatus(HttpStatus.OK)public User findUserById(@PathVariable("id")Integer id){ User user = userService.findUserById(id); return user ;}ResponseEntity<?>方式
@GetMapping(produces = "application/json;charset=utf-8")public ResponseEntity<List<User>> findAll(){ List<User> users = userService.findAll(); return new ResponseEntity<List<User>>(users , HttpStatus.OK);}MVC默认不支持 PUT和 DELETE方法,所以需要手动开启在 tomcat服务器的 web.xml文件中开启一下配置
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>readonly</param-name> <param-value>true</param-value><!--开启这个--> </init-param> <load-on-startup>1</load-on-startup> </servlet>在项目的 web.xml中配置
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter>
<filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>dispathcherServlet</servlet-name> </filter-mapping>MVC实现 REST代码实现JDK1.8maven3.60tomcat9API设计URI | Description | Response | HTTPStatus |
|---|---|---|---|
GET/users | 获取全部用户 | JSON | 200 |
GET/users/{id} | 获取指定主键的用户 | JSON | 200 |
PUT/users/{id} | 修改指定的主键的用户信息 | JSON | 200/201 |
POST/users | 增加一个用户 | JSON | 201 |
DELETE/users/{id} | 删除一个用户 | void | 204 |
@RestController@RequestMapping("/users")public class UserControler {
@Autowired private IUserService userService ;
//REST风格实现方法
/** * 查询所有 * @return */ @GetMapping(produces = "application/json;charset=utf-8") public ResponseEntity<List<User>> findAll(){ List<User> users = userService.findAll(); return new ResponseEntity<List<User>>(users , HttpStatus.OK); }
/**、 * 根据ID查询 * @param id * @return */
@GetMapping(path = "/{id}" , produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.OK) public User findUserById(@PathVariable("id")Integer id){ User user = userService.findUserById(id); return user ; } /** * 增加一个用户 * 返回该用户 */ @PostMapping(produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.CREATED) public User addUser(@RequestBody User user){ User newUser = userService.addUser(user); return newUser ; }
/** * 更新 * @param user */ @PutMapping(path = "/{id}" ,produces = "application/json;charset=utf-8") public ResponseEntity<User> updateUser(@PathVariable("id") Integer id , @RequestBody User user){ user.setUid(id); //资源是否修改 boolean flag = userService.updateUser(user); User deUser = userService.findUserById(id); if(flag) return new ResponseEntity<User>(deUser,HttpStatus.CREATED); return new ResponseEntity<User>(deUser,HttpStatus.OK); }
@DeleteMapping(path = "/{id}" , produces = "application/json;charset=utf-8") @ResponseStatus(HttpStatus.NO_CONTENT) public void delUser(@PathVariable("id") Integer id){ User user = userService.findUserById(id); userService.delUser(id); }}本文项目源码:https://github.com/946470326/MakerStack/tree/ssm