什么是RESTful接口;
RESTful严格来讲并不是指接口,他是一种接口规范或者说接口风格;网上一位博主的比喻我感觉最为恰当,就是URL+HttpMethod+HttpStatus 就可以知道这个API是干什么的,简单来讲就是见名知义;
- 采用URI标识资源;例如/user/getUser/1 表示user接口,然后获取ID为1的用户信息;类似于这种的
- 使用链接关联相关资源
- 使用统一的标准资源操作接口
例如:CRUD
public class ResourceService
{
public IEnumerable<Resource> Get();
public void Create(Resource resource);
public void Update(Resource resource);
public void Delete(String id);
}
- 使用标准的HTTP方法
http请求分为:GET\HEAD\OPTIONS\POST\PUT\DELETE;
其中幂等性方法是:GET\HEAD\OPTIONS 这些请求时获取资源的,没有边界和作用,剩下的几个就是非幂等性的。
springboot RESTful API风格demo
前期的准备工作就不一一赘婿了,大概如:创建springboot工程、引入jar包;创建数据库、创建表;
创建一个基于登陆用户的实体类;
package com.ht.erp.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* <p>
* 出货单
* </p>
*
* @author Nie.Y.G
* @since 2021-07-01
*/
@TableName("t_goods_out")
public class GoodsOut extends Model<GoodsOut> {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value="id", type= IdType.AUTO)
private Integer id;
/**
* 商品类型
*/
@TableField("goodsType")
@NotNull(message = "货物类型不能为空")
private String goodsType;
/**
* 商品名称
*/
@TableField("goodsName")
@NotNull
private String goodsName;
/**
* 商品价格
*/
@NotNull
private Float price;
/**
* 总出货量
*/
@TableField("totalNumber")
private Integer totalNumber;
/**
* 操作员
*/
private String operator;
/**
* 出货时间
*/
private Date inTime;
private String customerName;
private String customerPhone;
private String customerAddr;
public Integer getId() {
return id;
}
public GoodsOut setId(Integer id) {
this.id = id;
return this;
}
public String getGoodsType() {
return goodsType;
}
public GoodsOut setGoodsType(String goodsType) {
this.goodsType = goodsType;
return this;
}
public String getGoodsName() {
return goodsName;
}
public GoodsOut setGoodsName(String goodsName) {
this.goodsName = goodsName;
return this;
}
public Float getPrice() {
return price;
}
public GoodsOut setPrice(Float price) {
this.price = price;
return this;
}
public Integer getTotalNumber() {
return totalNumber;
}
public GoodsOut setTotalNumber(Integer totalNumber) {
this.totalNumber = totalNumber;
return this;
}
public String getOperator() {
return operator;
}
public GoodsOut setOperator(String operator) {
this.operator = operator;
return this;
}
public Date getInTime() {
return inTime;
}
public GoodsOut setInTime(Date inTime) {
this.inTime = inTime;
return this;
}
public String getCustomerName() {
return customerName;
}
public GoodsOut setCustomerName(String customerName) {
this.customerName = customerName;
return this;
}
public String getCustomerPhone() {
return customerPhone;
}
public GoodsOut setCustomerPhone(String customerPhone) {
this.customerPhone = customerPhone;
return this;
}
public String getCustomerAddr() {
return customerAddr;
}
public GoodsOut setCustomerAddr(String customerAddr) {
this.customerAddr = customerAddr;
return this;
}
@Override
protected Serializable pkVal() {
return this.id;
}
}
以用户的增删改查为例写了几个基于RESTful风格的接口;
package com.ht.erp.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ht.erp.constant.CommonConstant;
import com.ht.erp.entity.GoodsOut;
import com.ht.erp.handler.Result;
import com.ht.erp.service.impl.GoodsInServiceImpl;
import com.ht.erp.service.impl.GoodsOutServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
/**
* <p>
* 出货单 前端控制器
* </p>
*
* @author Nie.Y.G
* @since 2021-07-01
*/
@RestController
@RequestMapping("/erp/goodsOut")
public class GoodsOutController {
/**
* 分页查询 其他查询参数 参数名
*/
String GOODS_OUT = "goodsOut";
@Resource
GoodsOutServiceImpl goodsOutService;
@ApiOperation("根据查询条件分页查询出货单")
@RequestMapping(value = "/page", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public Result page(@RequestBody Map<String, Object> params) {
if (Objects.isNull(params.get(CommonConstant.CURRENT))) {
return Result.error("缺少必要参数");
}
int current = NumberUtil.parseInt(params.get(CommonConstant.CURRENT).toString());
int size = NumberUtil.parseInt(Optional.ofNullable(params.get(CommonConstant.SIZE).toString()).orElse("10"));
Page page = new Page(current, size);
QueryWrapper queryWrapper = new QueryWrapper();
if (Objects.nonNull(params.get(GOODS_OUT))) {
queryWrapper.setEntity(BeanUtil.fillBeanWithMap((Map) params.get(GOODS_OUT), new GoodsOut(), true));
}
Page<GoodsOut> GoodsOuts = goodsOutService.page(page, queryWrapper);
return Result.ok(GoodsOuts);
}
@ApiOperation("增加进货单信息")
@RequestMapping(value = "add", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public Result add(@Validated @RequestBody GoodsOut goodsOut) {
goodsOutService.save(goodsOut);
return Result.ok();
}
@ApiOperation("根据ID删除")
@RequestMapping(value = "/removeById/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
public Result removeById(@PathVariable @NotNull(message = "参数不能为空") int id) {
goodsOutService.removeById(id);
return Result.ok();
}
@ApiOperation("根据ID更新进货单")
@RequestMapping(value = "/update", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public Result updateById(@RequestBody GoodsOut goodsOut) {
if (Objects.isNull(goodsOut.getId())) {
return Result.error("缺少必要参数");
}
goodsOutService.updateById(goodsOut);
return Result.ok();
}
@ApiOperation("根据ID来获取指定的进货单")
@RequestMapping(value = "/getById/{id}", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public Result getById(@PathVariable @NotNull(message = "关键参数不能为空") int id) {
GoodsOut goodsOut = goodsOutService.getById(id);
return Result.ok(goodsOut);
}
}
我们用postman测试几个接口试试。
- 新增用户
- 删除用户
ok, 以上就是基于RESTful风格接口的小demo。