这是一个微服务蓬勃发展的时代。在微服务测试中,最典型的一种场景就是接口测试,其目标是验证微服务对客户端或其他微服务暴露的接口是否能够正常工作。对于最常见的基于Restful风格的微服务来说,其对外暴露的接口就是HTTP端点(Endpoint)。

这种情况下,完成微服务接口测试的主要方式就是构造并发送HTTP请求消息给微服务,然后接收并验证微服务回复的HTTP响应消息。在这个过程中,最基础的工作是正确构造HTTP请求消息。

一条HTTP请求消息中,包含各种各样的参数。了解HTTP请求参数的类型,对于我们正确构造HTTP请求消息十分重要。接下来,我们就一起看看HTTP请求消息中可能包含哪些类型的参数,以及它们各自的特点。

路径参数(path parameter)。在HTTP中,URL是一个很基本的概念,它表示的是服务端资源的路径,供客户端寻址和访问。URL一般是常量字符串,但在有些情况下,URL中某些部分是可变的。路径参数就是URL中可变的部分,其描述方式为{参数名}。例如,路径/blogs是不变的,而路径/blogs/{id}是可变的,其中可变的id就是路径参数。

路径参数一般用来指定集合中的某个具体元素。例如,服务端可能有许多blogs,而/blogs/{id}表示的就是某一篇具有特定id的blog。路径参数的特点如下:

一个URL中可以包含多个路径参数。

在传递路径参数时,直接将{参数名}替换成具体的值,例如/blogs/123456。

路径参数是必填的,不是选填的。

查询参数(query parameter)。和路径参数相同的是,查询参数也是URL的一部分,通常用来对资源进行排序或过滤。除此之外,它们有许多不同点:

查询参数以?符号开始,并以键值对(参数名=参数值)的形式呈现,同时用&符号区分不同键值对。例如/blogs?date=20200305&category=work就包含了两个参数date和category,传递的值分别是20200305和work。

根据服务端要求的不同,路径参数可以赋值,也可以不赋值(为空),还可以完全不传递。

查询参数和路径参数存在另一个共同点,那就是统一遵守URL编码。URL编码也叫做百分号编码,是针对一些URL中无法直接包含或者有特殊意义的字符进行编码的方式,例如空格被编码为%20,%被编码为%25。

Request Headers参数。路径参数和查询参数都是URL的一部分。在HTTP定义中,它们都位于HTTP请求消息的头部。实际上,对于HTTP消息头部来说,除了可以包含路径参数和查询参数外,还可以包含许多其他参数。它们统一叫做Request Headers参数。

这些参数属于metadata,即数据的数据,是用来描述其他数据的数据。例如Content-Length参数用来描述HTTP body的字节长度,Accept-Encoding参数用来描述客户端接受的文本编码方式。

Request Body参数。除了HTTP消息头部能够携带参数之外,HTTP消息体(body)也可以包含参数。HTTP body自身有许多类型,其具体类型由HTTP head中的Content-Type参数决定。对于不同类型的HTTP body来说,其携带参数的方式也是不同的。举例如下。

最经典的HTTP body类型是application/x-www-form-urlencoded,即URL编码的表单。其传递参数的方式与查询参数十分相似,例如date=20200305&category=work。当然也存在细微的区别。

具体来说,虽然application/x-www-form-urlencoded类型的body也是采用URL编码方式,但是编码规则略有不同。例如在URL编码中,空格的默认编码是%20,而在application/x-www-form-urlencoded类型的body中,其编码既可以是%20,也可以是+。

这类表单参数最大的一个不足,就是不能传递嵌套参数。在需要传递嵌套等复杂类型参数时,我们可以使用JSON类型的body。在HTTP中,JSON是MIME媒体类型的一种,其Content-Type为application/json。它可以传递各种复杂类型的参数,例如:{“date”: “20200305”, “category”: [“work”, “life”], “title”: {“subtitle”:“http”}}。

当然,HTTP body类型远远不止这两种,传递参数的方式也还有更多,例如XML参数,文件上传参数,二进制参数等。

以上介绍了几种主要的HTTP请求参数类型和传递方式。需要注意的是,它们只是理论。在工程实际中,如何运用这些参数呢?这时候,需要结合工具(例如swagger,postman,Python requests)的特点,具体情况具体分析。