简单了解那些所谓的架构风格--RESTful API

敲了这么的代码后,会发现以前的单体应用早已不能满足越来越繁杂的业务需求,开始转为前后端分离,分布式 ,微服务等架构模式。但是始终绕不开的服务发布和引用的方式这个问题。今天就先记录一下大家耳熟能详的RESTful

什么是RESTful API

该词是一个叫Fielding的大佬在2000年的论文中提出的,至于论文的具体的内容就不详细说了,人呢是站在技术巅峰的牛人,论文呢是开创了新的架构理念的论文,大家要是对英文版的有兴趣的人可以去找一下。

REST的缩写就是:Representational State Transfer,翻译过来大概就是“表现层状态转移”。

记得之前看到的一个大佬的话的大意是,REST只需把它的名字的意思弄懂就能理解大半,我对此非常认同。

Representational 表现层
  • 表现层即是资源的具现,而“资源”则是网上可抽象的事物,可以是一段文本、音视频、图片、网页等各种事物。
  • 而且一般通过JSON和xml格式来描述事务。
State 状态
  • 网站交互中,会发生数据和状态的变化,我们一般只关注资源状态的变化,而状态是保存在服务端的。
  • 且HTTP的请求是无状态的,因此服务的请求状态在发起请求时描述清楚
Transfer 转移
  • 即数据从服务端到前端或者服务到服务的这个过程
RESTful的方式

上面提到服务请求要在发起时描述清楚,那么客户端无非就是通过HTTP的几种方式实现CRUD,对应如下:

操作方式幂等
Create(Insert)POST
Read(Select)GET
UpdatePUT或PATCH
DeleteDELETE

通过这种方式一组crud的URL会从

http://localhost:8081/liqueur/addLiqueur
http://localhost:8081/liqueur/selectLiqueur
http://localhost:8081/liqueur/updateLiqueur
http://localhost:8081/liqueur/delLiqueur

统统简化为:

http://localhost:8081/liqueur

对于相同的url而服务端区分便是通过客户端的请求方式。

RESTful的实现

说的再多不如一份代码理解的透彻,但是有些东西的概念还是要先了解后才方便理解代码的。
下面便通过代码来展现服务端是如何在相同接口时通过请求方式来区分的

@Slf4j
@RestController
@RequestMapping("/liqueur")
public class LiqueurController {
    @Autowired
    private LiqueurService liqueurService;

    /**
     * GET方式 实现查询数据
     * @return List<Liqueur>
     */
    @GetMapping
    public List<Liqueur> findAllLiqueur(){
        List<Liqueur> list = liqueurService.findAllLiqueur();
        log.info("查询了:{} 条数据",list.size());
        return list;
    }

    /**
     * POST方式 实现数据插入
     * @param n 名称
     * @param p 价格
     * @return 插入数据条数
     */
    @PostMapping
    public int saveLiqueur(String n,Double p){
        Liqueur liqueur = Liqueur.builder()
                .name(n)
                .price(Money.of(CurrencyUnit.of("CNY"),p)).build();
        int count = liqueurService.saveLiqueur(liqueur);
        log.info("创建了:{} 条数据",count);
        return count;
    }

    /**
     * DELETE方式 实现数据删除操作,根据名称删除某条数据
     * @param n 名称
     * @return 删除数据条数
     */
    @DeleteMapping
    public int deleteLiqueur(String n){
        int count = liqueurService.deleteLiqueur(n);
        log.info("删除了:{} 条数据",count);
        return count;
    }

    /**
     * PUT方式 实现数据修改,根据名称修改价格
     * @param n 名称
     * @param p 价格
     * @return 修改数据条数
     */
    @PutMapping
//    @PatchMapping
    public  int updateLiqueur(String n,Double p){
        Liqueur liqueur = Liqueur.builder()
                .name(n)
                .price(Money.of(CurrencyUnit.of("CNY"),p)).build();
        int count = liqueurService.updateLiqueur(liqueur);
        log.info("修改了:{} 条数据",count);
        return count;
    }
}

代码如上,通过不同的请求方式实现接口的CRUT功能。
接口访问如下,
查询
在这里插入图片描述
新增
在这里插入图片描述
修改
在这里插入图片描述
删除
在这里插入图片描述
执行结果:
在这里插入图片描述
使用的注解@GetMapping,@PostMapping,@DeleteMapping,@PutMapping,@PatchMapping仅仅是在@RequestMapping中加上了method属性,明确了对应的请求方式,放一下源码,便一目了然

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(
    method = {RequestMethod.GET}
)
public @interface GetMapping {
    ...
}

总之,RESTful的简单应用就先介绍到这,如有问题或疑惑,欢迎大家指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值