大家好,我是玉米君,本篇文章将分别介绍接口的类型RPC、REST、GraphQL

1. 接口的意义

API(Application Programming Interface):应用编程接口, 简称“接口”。

举例:

  • 程序如有创建线程,需要调用操作系统的“接口”
  • 购物时,如果要清空购物车,调用电商系统的“接口”
  • 有一个程序,想要给另一个程序传递数据,需要调用它的“接口”

接口:程序之间约定的通信方法

特点:约定了调用方法,以及预期的行为,但是不透露具体细节

意义:程序能解耦,互通有无

接口很有重要,接口测试也非常有必要。

image20210223141222960.png

接口测试难度低,收益大,效果号,接口测试很有必要

对于一个系统,如果我们要低成本高质量的进行测试,接口测试的优先的选择。

2. 接口的类型

应用级接口:

  • RPC
  • REST
  • GraphQL

2.1 RPC

PRC (remote procedure call ) 远程过程调用,将其他程序、系统、软件的功能(函数)当作时本程序的功能,进行使用

举个例子:

程序A有函数add,实现加法的功能

程序B想要使用add,需要和A进行交流。

创建API: A和B约定,如有B传递xxxxx 到A,那么A对xxxx进行处理,并返回结果yyyy给B,

RPC用法: 在B中直接调用add

gRPC谷歌开发的高性能,跨语言的PRC组件

使用步骤:

  1. 定义数据格式 :pb
  2. 利用grpc组件,根据数据格式生成python代码
  3. 启动server (拥有add 的程序A)
  4. 启动client,调用server中的方法

  1. 安装相关工具

    pip install grpcio  grpcio-tools
    
  2. 定义数据格式

    https://developers.google.com/protocol-buffers/docs/overview

    //  yumi.proto
    syntax = "proto3";
    
    service Yumi{
        rpc add(Request) returns (Response) {} ;
    
    }
    
    message Request {
      int32 a = 1;
      int32 b = 2;
    }
    
    message Response {
      int32 c = 3;
    }
    
  3. 生成python文件

    python -m grpc.tools.protoc   --python_out=. --grpc_python_out=. -I. sanmu.proto
    
    sanmu.proto  # 协议(数据格式)
    sanmu_pb2.py  # python版的协议
    sanmu_pb2_grpc.py # python的grpc (server 和client)
    
  4. 启动server

    
    from concurrent import futures
    
    import grpc
    
    import sanmu_pb2
    import sanmu_pb2_grpc
    
    
    class Sanmu(sanmu_pb2_grpc.SanmuServicer):
        def add(self, request, context):
            a, b = request.a, request.b
            print(f"{a=}, {b=}")
    
            c = a + b
            return sanmu_pb2.Response(c=c)
    
    
    def serve():
        server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        sanmu_pb2_grpc.add_SanmuServicer_to_server(Sanmu(), server)
        server.add_insecure_port("[::]:50051")
        server.start()
        server.wait_for_termination()
    
    
    if __name__ == "__main__":
        serve()
    
  5. 启动client

    import grpc
    
    import sanmu_pb2
    import sanmu_pb2_grpc
    
    
    def add(a: int, b: int) -> int:
        # 连接到rpc服务器
        channel = grpc.insecure_channel("[::1]:50051")
        # 调用  add 服务
        stub = sanmu_pb2_grpc.SanmuStub(channel)
        response = stub.add(sanmu_pb2.Request(a=a, b=b))
    
        return response.c
    
    
    print(add(1, 2))
    
    

RPC特点:

  1. 有serve端和client端,自动生成
  2. 不清楚PRC通信的细节

对RPC进行测试,只需要拥有RPC客户端,然后对其调用即可

2.2 REST

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

如果一个架构符合REST原则,就称它为RESTful架构。

​ ——《理解RESTful架构 - 阮一峰的网络日志 (ruanyifeng.com)

REST :软件架构

RESTful :符合REST的风格

RESTful API: 符合REST风格的 API

REST 和 RPC正好相反:REST没有提供专用的独立客户端,反倒是要求你对协议细节掌握额度比较清楚。

因为 REST【充分】使用HTTP语义,来描述资源 和对资源的操作:

  1. 使用 URL 表示 资源
  2. 使用 METHOD 表示对资源的操作 (GET POST)
  3. 使用 STATUS_CODE 表示对操作的结果

先有HTTP,后有REST,RESTful是一种风格,没有具体的要求和约束,所以在接口具体实现上有很大的差异。

  1. 数据格式:
    1. json
    2. xml
    3. 表单
    4. raw
  2. 请求方法:
    1. 各种method
    2. 只是用POST
  3. 鉴权方式:
    1. cookies
    2. basic auth
    3. api-key
    4. jwt (json web token)
    5. OAuth 2.0

为了统一接口Restful API细节,行业推出接口的规范 OAS (OpenAPI Specification)

swagger 2.0

openapi 3.0

swagger 是API工具集合:

  • 接口设计工具
  • 接口文档工具
  • 接口代码生成工具

从3.0开始,接口规范贡献给了OAS组织。

2.3 GraphQL

GraphQL是更加强大更加先进,更加灵活的接口类型,更加准确的说它是个查询语言。

GraphQL也是基于HTTP协议的,但是和REST相反:

  • 只需要一个URL
  • 只需要一个METHOD
  • 所有的参数放在body中

这个参数实际上是一种查询的语法,可以编写负债的查询语句,一次性从接口中获取所有需要的数据。

VS REST:

  1. 查询商品分类
  2. 根据商品分类,查询商品列表
  3. 根据商品ID,查询商品价格

举个例子:

POST https://demo.saleor.io/graphql/

POST https://demo.saleor.io/graphql/


GITHUB API V3: REST

GITHUB API V4: GraphQL

3. 接口自动化测试思路

接口测试及其自动化.png