-
Notifications
You must be signed in to change notification settings - Fork 626
REST,RESTfulAPI是什么?
sqmax edited this page Feb 13, 2019
·
1 revision
老师做课程介绍时,说了我们本次项目是RESTful风格的,老师也没有说RESTful是什么意思,第一次听说这个概念,有点疑惑。:worried:
现在项目已经完成,通过对项目的理解和搜索一些资料,做一下简单的阐述。
- REST的全称是Representational State Transfer,翻译下来就是“表现层状态转移”。
- REST的名称"表现层状态转化"中,省略了主语Resource。"表现层"其实指的是"资源"(Resources)的"表现层"。“资源”是REST架构或者说整个网络处理的核心。
- Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。
- 对资源的添加,修改,删除等操作,用HTTP协议里的动词来实现。如下:
GET 用来获取资源
POST 用来新建资源(也可以用于更新资源)
PUT 用来更新资源
DELETE 用来删除资源
- Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本。
- 用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等。
Spring中也有Restful请求相关的注解@RestController
,它是Spring4.0新添加的,是@Controller
,@ResponseBody
的组合注解。
该注解用于controller上,该注解下的方法返回的对象(可序列化的)可直接响应给客户端,以json格式展示,也可用于前后端分离的项目(返回的对象模型可以填充到前端界面中)。
@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {
@Autowired
private ProductService productService;
@Autowired
private CategoryService categoryService;
@GetMapping("/list")
@Cacheable(cacheNames = "product",key = "123",unless = "#result.getCode()!=0")
public ResultVO list(){
//1.查询所有的上架的商品
List<ProductInfo> productInfoList=productService.findUpAll();
//2.查询在架商品所属类目(一次性查询)
// List<Integer> categoryTypeList=new ArrayList<>();
// //传统方法
// for(ProductInfo productInfo: productInfoList){
// categoryTypeList.add(productInfo.getCategoryType());
// }
//精简方法lamba表达式
List<Integer> categoryTypeList=productInfoList.stream()
.map(e->e.getCategoryType()).collect(Collectors.toList());
List<ProductCategory> productCategoryList=categoryService.findByCategoryTypeIn(categoryTypeList);
//3. 数据拼装
List<ProductVO> productVOList=new ArrayList<>();
for(ProductCategory productCategory: productCategoryList){
ProductVO productVO=new ProductVO();
productVO.setCategoryName(productCategory.getCategoryName());
productVO.setCategoryType(productCategory.getCategoryType());
List<ProductInfoVO> productInfoVOList=new ArrayList<>();
for(ProductInfo productInfo: productInfoList){
if(productInfo.getCategoryType().equals(productCategory.getCategoryType())){
ProductInfoVO productInfoVO=new ProductInfoVO();
BeanUtils.copyProperties(productInfo,productInfoVO);
productInfoVOList.add(productInfoVO);
}
}
productVO.setProductInfoVOList(productInfoVOList);
productVOList.add(productVO);
}
// ResultVO resultVO=new ResultVO();
// resultVO.setData(productVOList);
// resultVO.setCode(0);
// resultVO.setMsg("成功");
ResultVO resultVO=ResultVOUtil.success(productVOList);
return resultVO;
}
}
上面ResultVO的定义如下:
@Data
//@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultVO<T> implements Serializable{
private static final long serialVersionUID = 3068837394742385883L;
/**错误码**/
private Integer code;
/**提示信息**/
private String msg;
/**具体内容**/
private T data;
}
对于上面商品列表的接口,http://127.0.0.1:8080/sell/buyer/order/list?openid=abcabcvc
。
首先,我们用浏览器访问,会返回如下的json数据:
使用前端界面访问,就会得到如下画面:
所以对于前后端分离的项目,前后端人员可以共同协商写一份API文档(包含访问接口,和返回数据格式),然后后端人员,就会根据根据接口进行开发,并按API文档要求返回指定格式的数据。
详情参考:
- 知乎热门话题:
RESTful - 阮一峰的两篇文章:
理解RESTful架构
RESTful API 设计指南 - Spring构建RESTful Web Service的GETTING STARTED教程:
Building a RESTful Web Service
目录