http接口测试与Controller写法总结

探究不同类型的Controller方法该如何使用ApiPost进行接口测试。

常用的接口测试工具主要有以下几种:

  • Postman(ApiPost): 简单方便的接口调试工具,便于分享和协作。具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档, 接口监控等功能;
  • JMeter: 开源接口测试及压测工具,支持Linux及无界面运行;
  • LR: 商业版接口性能测试工具,简单易用,功能强大;
  • SoupUI: 开源,WebService接口常用测试工具,也可以测试Rest接口及接口安全。

本文以接口测试工具ApiPost进行测试,探究不同类型的Controller方法该如何使用ApiPost进行接口测试。

请求类型

GET请求:请求指定的页面信息,并返回实体主体。(通常用来接收数据)。

POST请求:向指定资源提交数据进行处理请求,数据被包含在请求体中。POST请求可能会导致新的资源的建立、已有资源的修改。(通常用来发送数据)。

HEAD请求:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。

PUT请求:从客户端向服务器传送的数据取代指定的文档的内容。

DELETE请求:请求服务器删除指定的页面。

CONNECT请求:能够将连接改为管道方式的代理服务器。

OPTIONS请求:允许客户端查看服务器的性能。

TRACE请求:显示服务器收到的请求,主要用于测试或诊断。

请求方式

  • key-value参数(query):把参数拼接在url的后面由?相连,多个参数之间用&相连。
  • Json串传参:需要在请求的body写中,入Json格式参数。

创建SpringBoot测试环境

对环境的要求不高,创建SpringBoot项目的时候需要导入web、lombok、thyleleaf的依赖。

  • web依赖可以将项目持续运行在服务器中,供前端或者接口测试工具进行访问
  • lombok方便我们后面返回json直接使用实体类进行返回
  • thymeleaf方便我们直接返回试图名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

创建项目

本文以接口测试

  1. 选择方法GET/POST
  2. 请求路径要输入后端端口路径(不要输入前端网址,一定要好好查看请求路径)
  3. 参数/头部参数/body参数(如果是token要放在Header中)

Get请求

1、无参数的请求-原始-请求页面

用来接收简单的get请求,不需要前端传递参数,此请求一般用作页面跳转,后面不对这种原始的方法进行使用。

Controller写法

比较传统的Controller请求书写方式

1
2
3
4
5
6
7
//1、无参数的Get请求-原始
@RequestMapping(value = "/initGet", method = RequestMethod.GET)
public String initGet() {
System.out.println("请求成功");
return "index";
}

浏览器测试

接口测试

  1. 设置请求方式为get
  2. 输入url

2、无参数的请求-简略-请求页面

&#x20;@GetMapping 注解:是 @RequestMapping(method = RequestMethod.GET) 的快捷方式,专门用于处理 GET 请求。

Controller写法

1
2
3
4
5
6
//2、无参数的Get请求-简略
@GetMapping("/simpleInitGet")
public String simpleInitGet() {
return "index";
}

浏览器测试

接口测试

  1. 设置请求方式为get
  2. 输入url

3、对应RequestParam注解-请求页面

RequestParam可以用来接受前端的参数,需要前端访问的时候在url加上?以连接参数

Controller写法

1
2
3
4
5
6
7
//对应RequestParam注解的Get请求
@GetMapping("/requestParam")
public String getExample(@RequestParam("param1") String param1, @RequestParam("param2") int param2) {
System.out.println(param1);
System.out.println(param2);
return "index";
}

浏览器请求

接口测试

  1. 设置请求方式为get
  2. 输入url
  3. 设置请求参数(在query中,query中的参数和url中的参数是会同步生成的)

4、对应PathVariable注解-请求页面

PathVariable相当于用于获取 URL 中的路径变量。通常在 RESTful API 的设计中使用,可以通过 GET 请求获取指定路径的资源信息。

Controller写法

1
2
3
4
5
6
//4、对应PathVariable注解的Get请求
@GetMapping("/pathVariable/{id}")
public String pathVariable(@PathVariable("id") int id) {
System.out.println(id);
return "index";
}

浏览器请求

接口测试

  1. 设置请求方式为get
  2. 输入url并将参数通过拼接在里面(注意,这里的query参数是不需要写的,在url中写了也不会被识别)

5、ResponseBody请求json

使用 @ResponseBody 注解:可以将方法的返回值直接作为响应体返回,并自动进行序列化为 JSON 数据。

Controller写法

1
2
3
4
5
6
7
8
9
//1、使用ResponseBody返回JSON
@GetMapping("/responseBody")
@ResponseBody
public Map<String, Object> responseBody() {
Map<String, Object> data = new HashMap<>();
data.put("key1", "value1");
data.put("key2", "value2");
return data;
}

浏览器请求

接口测试

6、当参数需要传入对象

当Controller的参数列表需要传入一个或者多个对象该怎么办?

事实上,我们并不需要将这几个字段的完整json传入到参数列表中,并且get请求其实也不支持我们传入json格式。我们只需要将这几个对象中,需要传入的的字段进行传入就行,传入方法就是拼接在URL后面。

实体类文件

  • Page对象
1
2
3
4
5
@Data
public class Page {
int current;
int size;
}
  • UnitVo对象
1
2
3
4
5
@Data
public class UnitVo {
String unitVoId;
String unitVoName;
}

Controller写法

1
2
3
4
5
6
7
8
//Get方法,参数列表为对象该怎么办?
@GetMapping("/paramListHasOneObject")
public List paramListHasOneObject(Page page , UnitVo unitVo){
List<Object> list = new ArrayList<>();
list.add(page);
list.add(unitVo);
return list;
}

浏览器请求

接口测试

注意,此时我们不需要使用RequestBody注解,因为那是Post才能用到的。

由此我们可以进一步得出一个结论,当我们需要前端传入UnitId过来时,我们可以将参数列表设置为Unit对象就行,然后从对象中获取到id。

如果有重复属性怎么办?

如果参数列表中的两个实体类有一个相同的属性,那当我们在url中传入一个数值,两个对象的此属性都会被给到值。

Post请求

关于form-data、x-www-form-urlencoded、raw、binary的区别

https://www.jb51.net/web/804328.html

form-data(可键值对可文件)

就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;

由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

x-www-form-urlencoded

就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=java&age = 23

raw

可以上传任意格式的文本,可以上传text、json、xml、html等。

binary

相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

1、使用RequestParam接收表单数据

后端Post请求使用RequestParam注解可以接收前端键值对格式的表单数据,使用form-data 和 x-www-form-urlencoded测试都可以。multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。

通常情况下,普通的表单提交默认都是x-www-form-urlencoded,form-data也是可以的;而如果是文件上传,则必须是form-data。&#x20;

  1. 接收表单数据:通常用于接收 HTML 表单提交的数据。Controller 方法可以直接接收表单字段作为方法参数,使用 @RequestParam 注解或不加注解即可。示例代码如下:

Controller方法

1
2
3
4
5
6
7
8
9
@PostMapping("/postForm")
@ResponseBody
public Map<String, Object> postForm(@RequestParam("username") String username, @RequestParam("password") String password) {
// 处理接收到的表单数据的逻辑
Map<String, Object> data = new HashMap<>();
data.put("username", username);
data.put("password", password);
return data;
}

接口测试

此Controller方法有三种测试方法,首先将请求方法中选择POST

  1. 在参数(Query)中测试,将Body请求设置为none

  1. 将参数(Query)关闭,在body中的form-data(表单数据进行设置)

  1. 将参数(Query)关闭,在body中的form-data(表单数据进行设置)

为什么使用raw发送json数据不行呢?因为raw发送的是一个json对象,RequestParam接收的是键值对。

2、使用RequestBody接收JSON数据(raw-json)

使用RequestBody注解可以接收前端的JSON数据,接口测试工具可以用raw-json进行发送测试。

Controller方法

如果Controller中直接用实体类来进行接收,一定要在实体类上面使用Lombok的Data注解。

1
2
3
4
5
6
7
8
9
@PostMapping("/raw-json")
@ResponseBody
public Map<String, Object> postForm(@RequestBody Map<String, Object> data) {
// 处理接收到的表单数据的逻辑
Map<String, Object> data2 = new HashMap<>();
data2.put("username", data.get("username"));
data2.put("password", data.get("password"));
return data2;
}

接口测试


http接口测试与Controller写法总结
http://wahoyu.xyz/2023/06/30/API&Controller/
作者
Wahoyu
发布于
2023年6月30日
许可协议