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
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!