rest是面向资源的(名词)
rest通过uri暴露资源时不要再uri中出现动词
象是这样 GET /api/dogs/{id}
用HTTP方法体现对资源的操作
·get方法获取资源
.post方法添加资源
.put方法修改资源
.delete方法删除资源
HTTP状态码
通过HTTP状态码体现动作的结果,不要自定义
200 OK
400 错误请求(像是用户输入错误)
500 系统内部发生错误(像是系统自己代码的错误)
get方法和查询参数不应该改变数据
改变数据交给post put delete
使用复数名词
/dogs而不是/dog
复杂资源关系表达式
/cars/711/drivers 返回使用car711号的所有司机
/cars/711/drivers/4 返回使用car711的所有司机中的四号司机
高级用法::HATEOAS
超媒体所谓应用状态的引擎,restful api最好做到返回结果中提供链接,连向其他API方法,使得 用户不查文档也知道下一步做什么
为集合提供过滤 排序 选择 和分页等功能
版本化你的API
在请求前面加上API版本
符合标准的代码
package com.caohao.bootlearn.model;
public class Article {
/**
* id : 1
* name : caohao
*/
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.caohao.bootlearn.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class AjaxResponse {
private boolean isok;//是否成功
private int code;//状态码
private String message;//信息
private Object data;//数据
public static AjaxResponse SUCCESS(Object data){
AjaxResponse ajaxResponse = new AjaxResponse();
ajaxResponse.setIsok(true);
ajaxResponse.setCode(200);
ajaxResponse.setMessage("Success");
ajaxResponse.setData(data);
return ajaxResponse;
}
public static AjaxResponse SUCCESS(){
AjaxResponse ajaxResponse = new AjaxResponse();
ajaxResponse.setIsok(true);
ajaxResponse.setCode(200);
ajaxResponse.setMessage("Success");
return ajaxResponse;
}
public static AjaxResponse requestFalse(Object data){
AjaxResponse ajaxResponse = new AjaxResponse();
ajaxResponse.setIsok(false);
ajaxResponse.setCode(400);
ajaxResponse.setMessage("requestFalse");
ajaxResponse.setData(data);
return ajaxResponse;
}
public static AjaxResponse requestFalse(){
AjaxResponse ajaxResponse = new AjaxResponse();
ajaxResponse.setIsok(false);
ajaxResponse.setCode(400);
ajaxResponse.setMessage("requestFalse");
return ajaxResponse;
}
}
package com.caohao.bootlearn.controller;
import com.caohao.bootlearn.model.AjaxResponse;
import com.caohao.bootlearn.model.Article;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/rest")
public class RestFulTestController {
@RequestMapping(value = "/Articles",method = RequestMethod.POST,produces = "application/json")
//@PostMapping("/Articles")
public AjaxResponse saveObject(@RequestBody Article article){
log.info("saveArticles"+article);
//.....
return AjaxResponse.SUCCESS(article);
}
@DeleteMapping("/Articles/{id}")
public AjaxResponse deleteArticle(@PathVariable int id){
log.info("delete Articles"+id);
//.....
return AjaxResponse.SUCCESS(id);
}
@PutMapping("/Articles/{id}")
public AjaxResponse updateArticle(@RequestBody Article article,@PathVariable int id){
log.info("changeArtices"+article);
//......
return AjaxResponse.SUCCESS(article);
}
@GetMapping("/Articles/{id}")
public AjaxResponse getArticle(int id){
log.info("getArticles"+id);
//.....
return AjaxResponse.SUCCESS(id);
}
}
代码测试