Skip to content

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数据:

rest1.PNG

使用前端界面访问,就会得到如下画面:

rest2.PNG

所以对于前后端分离的项目,前后端人员可以共同协商写一份API文档(包含访问接口,和返回数据格式),然后后端人员,就会根据根据接口进行开发,并按API文档要求返回指定格式的数据。


详情参考: