![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZWdrULOjw9lxaJ3Mtzn9OoajbfI_wL8KtPuZWg2Wl-aAunPHLJJCEJt5ipKxwbr-0.jpg)
RPC
RPC=remote procedure call,执行远程服务器上的一个function,举例:
服务端定义了三个函数:
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZPcm9Mqxk12_SbsFpyFuTKCtOFzBkASJuQtFrVuGm9yA1GaZMfwbTQ5H8ij9nlQCY.jpg)
客户端发起请求
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZMdygLAonHMnsiEstuBdv2VqhTqad1lvOa5Rdc50aRbNeIcArkKwRZYPJ7hzKhD-s.jpg)
RPC在一些大公司中依然被使用。
RPC的优点有:
- 设计简洁,便于理解
- 轻量的payload
- 很高的性能表现
缺点有:
- 前后端代码高耦合
- 代码可读性不好,相关代码不容易被定位
- 会导致有大量被定义的函数,难以管理
REST
REST = Representational state transfer,直接翻译就是『表现层状态转移』
优点:
- 前后端高度解耦
- 便于理解,即使没有看文档,也能大概知道接口是用来做什么的;
- 接口的功能有单一性,便于扩展和复用;
- 利用了HTTP原本的特性
缺点:
- 有时payload会变的特别大
- 同一个页面可能要调用很多个API,来获取不同的东西,在网络差的情况下会降低体验
举例:
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiafn2CXAQhiaUxuKhqlnfk89nBUwDPM_LRyJcli8HfctnDmOs_fjb1OnLxpDDre3xc.jpg)
GraphQL
GraphQL = Graph query language
吸取了RPC和REST的一些共同优点;以查询为基本单元,方便获取到想要的数据,举例:
接口定义
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibDCwFDEk86QgqbMSxxsu0qyvfG11pNJiTlKLOfLwFiyiMJ4vRN2kSjXi9CFHZOvOc.jpg)
接口调用
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaGfYFEi-CAZ33RlqO6jLig4jXsMQ1Au6C22zCcz2gHaYsPEnsAXNwrKuKJ5B_DS3U.jpg)
优点:
- 低网络速度下表现优异
- 声明式地数据获取
- 根据UI需求获取合适的数据,避免不必要的数据传输
缺点:
- 定义起来相对复杂
- 缓存问题,需要一个更加健全的机制中来确保字段级别的缓存
- 版本持续更新中,还不太成熟
综合对比与总结
API设计也不会有银弹。
设计API时,决定使用哪种形式,得先考虑所设计的API将会被谁使用:
- 如果是关注于对象和资源的项目,需要对接各种不同的端和使用者,需要便于使用和阅读文档,那么适合使用REST
- 如果是面向行为动作,或者内部的一些微服务,对响应要求高,那么可以考虑RPC
- 如果是需要给UI提供数据,或者需要对弱网络环境下优化而减少请求,那么可以考虑GraphQL
![RPC 、REST、GraphQL三种API设计方式的简介和比较 RPC 、REST、GraphQL三种API设计方式的简介和比较](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibKB_ibRNp-tUJYsQMQfptZwrLLqKK4_o2sKQhxyvU5g-Zv3tpD0ruxHNx0PX0gMf0.jpg)
参考来源
https://www.youtube.com/watch...