SpringBoot开发Restful API及使用jmeter测试
Restful API简介
Representational State Transfer,简称为REST, 即表现层状态转化,简单来说,客户端通过HTTP方法对服务器的资源进行操作, 实现表现层状态转化
GET:获取资源 POST:新建资源 PUT:更新资源 DELETE:删除资源
Restful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计;
构建Restful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。
Restful API设计原则
1、API的版本应该在URL中体现,如 http://api.qzcsbj.com/v2
2、URL中不要使用动词,应使用资源名词,且使用名词的复数形式,例如:
URL 请求类型 说明
/v2/users GET 获取用户列表
/v2/users POST 添加用户
/v2/users PUT 修改用户
/v2/users/{id} GET 根据id获取用户
/v2/users/{id} DELETE 根据id删除用户
/v2/users/{id} PUT 根据id修改用户
3、服务器响应时返回JSON对象,应包含HTTP状态码、消息、结果等,如:
{
"code": 1,
"msg": "请求成功",
"data": {
"id": 1,
"username": "qzcsbj1",
"password": "62f7f5673e94eca261b8fce7ae7863a4",
"realName": "qzcsbj1",
"sex": "男",
"birthday": "2018-09-06",
"phone": "13800000001",
"utype": "0",
"addtime": "2023-01-01 11:24:49.0",
"adduser": "qzcsbj"
}
}
Restful API开发:CRUD
数据库表
SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL COMMENT '用户名', `password` varchar(255) NOT NULL COMMENT '密码', `real_name` varchar(255) NOT NULL COMMENT '真实名', `sex` varchar(255) DEFAULT NULL COMMENT '性别', `birthday` date DEFAULT NULL COMMENT '生日', `phone` varchar(255) NOT NULL COMMENT '电话', `utype` tinyint(1) DEFAULT NULL COMMENT '用户类型', `addtime` datetime DEFAULT NULL COMMENT '添加时间', `adduser` varchar(255) DEFAULT NULL COMMENT '添加者', PRIMARY KEY (`id`), UNIQUE KEY `phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实体类
package com.qzcsbj.demo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 5753660691492463802L;
private Integer id; // 实体类推荐用包装类
private String username;
private String password;
private String realName;
private String sex;
private Date birthday;
private String phone;
private String utype;
private String addtime;
private String adduser;
}
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qzcsbj.demo</groupId>
<artifactId>springbootdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置
application.properties
spring.profiles.active=test
application-test.properties
# 测试环境 server.port=8082 # 配置数据库的连接信息 spring.datasource.url=jdbc:mysql://192.168.117.180:3306/gift?useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=qzcsbj spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # 指定Mapper.xml的位置 mybatis.mapper-locations=classpath:mappers/*.xml # 给实体类取别名 mybatis.type-aliases-package=com.qzcsbj.demo.pojo
mapper接口:UserMapper
package com.qzcsbj.demo.mapper;
import com.qzcsbj.demo.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
@Mapper
public interface UserMapper {
// restful api:增、删、改、查
int add(User user);
int delete(Integer id);
int update(User user);
User findById(Integer id);
List<User> findAll();
}
xml映射文件(resources下的mappers目录中:UserMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qzcsbj.demo.mapper.UserMapper">
<resultMap id="userMap" type="com.qzcsbj.demo.pojo.User">
<id column="id" property="id"/>
<result column="real_name" property="realName"/>
</resultMap>
<!--restful api:增-->
<insert id="add" parameterType="User">
insert into user values(null,#{username},#{password},#{realName},#{sex},#{birthday},#{phone},#{utype},now(),#{adduser})
</insert>
<!--restful api:删-->
<delete id="delete">
delete from user where id=#{id}
</delete>
<!--restful api:改-->
<update id="update">
update user set username=#{username},password=#{password},real_name=#{realName},sex=#{sex},birthday=#{birthday},phone=#{phone},utype=#{utype},adduser=#{adduser}
where id=#{id}
</update>
<!--restful api:查-->
<select id="findById" resultMap="userMap">
select * from user where id=#{id}
</select>
<!--restful api:查所有-->
<select id="findAll" resultMap="userMap">
select * from user
</select>
</mapper>
service层接口:UserService
package com.qzcsbj.demo.service;
import com.qzcsbj.demo.pojo.User;
import java.util.List;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
public interface UserService {
// restful api:增、删、改、查、查所有
int add(User user);
int delete(Integer id);
int update(User user);
User findById(Integer id);
List<User> findAll();
}
service层实现类:UserServiceImpl
package com.qzcsbj.demo.service.impl;
import com.qzcsbj.demo.mapper.UserMapper;
import com.qzcsbj.demo.pojo.User;
import com.qzcsbj.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
// restful api:增
@Override
public int add(User user) {
return userMapper.add(user);
}
// restful api:删
@Override
public int delete(Integer id) {
return userMapper.delete(id);
}
// restful api:改
@Override
public int update(User user) {
return userMapper.update(user);
}
// restful api:查
@Override
public User findById(Integer id) {
return userMapper.findById(id);
}
// restful api:查所有
@Override
public List<User> findAll() {
return userMapper.findAll();
}
}
controller层
package com.qzcsbj.demo.controller;
import com.qzcsbj.demo.commons.ResultCode;
import com.qzcsbj.demo.commons.ResultCommon;
import com.qzcsbj.demo.mapper.UserMapper;
import com.qzcsbj.demo.pojo.User;
import com.qzcsbj.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
@RestController
@RequestMapping("/v2")
public class UserController {
@Autowired
UserService userService;
// restful api:增
@PostMapping("/users")
public ResultCommon add(User user){
int n = userService.add(user);
if (n>0){
return ResultCommon.success(ResultCode.SUCCESS);
} else {
return ResultCommon.fail(ResultCode.FAIL);
}
}
// restful api:删
@DeleteMapping("/users/{id}")
public ResultCommon delete(@PathVariable("id") Integer id){
int n = userService.delete(id);
if (n>0){
return ResultCommon.success(ResultCode.SUCCESS);
} else {
return ResultCommon.fail(ResultCode.FAIL);
}
}
// restful api:改
@PutMapping("/users")
public ResultCommon update(User user){
int n = userService.update(user);
if (n>0){
return ResultCommon.success(ResultCode.SUCCESS);
} else {
return ResultCommon.fail(ResultCode.FAIL);
}
}
// restful api:查
@GetMapping("/users/{id}")
// @RequestMapping(value = "/user/{id}", method=RequestMethod.GET)
public ResultCommon findById(@PathVariable("id") Integer id){
User user = userService.findById(id);
return ResultCommon.success(ResultCode.SUCCESS, user);
}
// restful api:查所有
@GetMapping("/users")
public ResultCommon findAll(){
List<User> users = userService.findAll();
return ResultCommon.success(ResultCode.SUCCESS, users);
}
}
jmeter测试Restful API
http请求默认值
ip、端口

增



删



改
上图是修改前


修改后

查


查所有


原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/17065905.html
__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号