撸一个SpringBoot网络测试服务

写在前面

作为一个Android开发者为什么要撸一个网络测试服务呢?
试想一下,当你想自己封装下网络请求库,埋头撸出来了,也不知道有没有问题,
反正就是撸出来了,有没有问题不知道,想要测试要不在网上找相关的开放api去测试,
但是哪有完全符合自己预期的开放api,为了解决这个问题,动手自己撸一个测试服务吧。

正文开始

服务项目相关
  1. Java环境,作为Android开发者,这个已经具备。
  2. 数据库,这个在测试服务非必须,不做展开。
  3. IDE,这里采用IDEA,可以用试用版,完全足够了。
开撸
  1. SpringBoot项目建立,选择JavaWeb项目相关,数据库相关不需要(mybatis,jpa)都不需要。
  2. 生成的application如下,SpringBootApplication忽略数据库相关配置:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SimpleApplication {
    public static void main(String[] args) {
        SpringApplication.run(SimpleApplication.class, args);
    }
}
  1. 在application.properties项目配置
#项目配置相关
#访问路径
server.servlet.context-path=/simple
#端口号
server.port=8085
#编码
server.tomcat.uri-encoding=utf-8
# 上传文件大小限制修改
spring.servlet.multipart.max-file-size=1000MB
spring.servlet.multipart.max-request-size=10000MB
  1. 新建Controller如下:
@RestController
public class ControllerTest {
}
  1. 新建返回类如下,注意要使用@Data需要引入lombok,安装lombok插件:
@Data
public class ResultVO<T> {

    private Integer code;
    private String message;
    private T body;

}
  1. 在第4步的Controller新建Get请求,有两个参数id和code,主要打印出两个请求参数,并构建返回:
@GetMapping("/info")
    public ResultVO<String> doGet(String id, String code) {
        System.out.println("id:" + id + "\ncode:" + code);
        ResultVO<String> resultVO = new ResultVO<String>();
        resultVO.setCode(200);
        resultVO.setMessage("Get请求成功");
        resultVO.setBody("id=" + id + "---" + "code=" + code);
        return resultVO;
    }
  1. Post表单请求,跟get类似,但是需要两个header session和deviceId
 @PostMapping("/login")
    public ResultVO<String> doPost(@RequestHeader("session") String session,
            @RequestHeader("deviceId")String deviceId,
            @RequestParam("userName") String userName, @RequestParam("password") String password) throws IOException {
        System.out.println("session:"+session);
        System.out.println("deviceId:"+deviceId);
        System.out.println("userName:" + userName + "\npassword:" + password);
        ResultVO<String> resultVO = new ResultVO<String>();
        resultVO.setCode(200);
        if (null == userName) {
            throw new IOException("123");
        }
        resultVO.setMessage("PostParas请求成功");
        resultVO.setBody("userName=" + userName + "---" + "password=" + password);
        return resultVO;
    }
  1. Post Json请求,需要一个请求实体类,实体类和方法如下:
@Data
public class LoginBean {
    private String userName;
    private String password;
}
 @PostMapping("/login1")
    public ResultVO<LoginBean> doPost1(@RequestBody LoginBean loginBean) {
        System.out.println("userName:" + loginBean.getUserName());
        System.out.println("password:" + loginBean.getPassword());
        ResultVO<LoginBean> resultVO = new ResultVO<LoginBean>();
        resultVO.setCode(200);
        resultVO.setMessage("PostJson请求成功");
        resultVO.setBody(loginBean);
        return resultVO;
    }
  1. 上传文件请求,进行文件存储并返回路径,存储在用户下的upload文件夹,将用户名改成自己的mac用户(Windows环境将存储路径进行修改)
 @PostMapping("/uploadFile")
    public ResultVO<String> uploadFile(@RequestParam("file") MultipartFile file, Model model, HttpServletRequest request) {
        if (file == null) {
            System.out.println("文件为空");
            ResultVO resultVO = new ResultVO();
            resultVO.setCode(500);
            resultVO.setMessage("上传文件为空");
            return resultVO;
        }
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        String filePath = "/Users/用户名/upload/";
        fileName = UUID.randomUUID() + suffixName;
        File dest = new File(filePath + fileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String fullFileName = filePath + fileName;
        model.addAttribute("fullFileName" + fullFileName);
        ResultVO resultVO = new ResultVO();
        resultVO.setCode(200);
        resultVO.setMessage("上传成功");
        resultVO.setBody("成功:" + fullFileName);
        return resultVO;
    }
  1. 上传多文件,和上传文件类似
  @PostMapping("/uploadFiles")
    public ResultVO<List<String>> uploadFile(@RequestParam("files") MultipartFile[] files, Model model, HttpServletRequest request) {
        if (files == null) {
            System.out.println("多文件为空");
            ResultVO resultVO = new ResultVO();
            resultVO.setCode(500);
            resultVO.setMessage("上传的文件为空");
            return resultVO;
        }
        List<String> fullNames = new ArrayList<>(files.length);
        for (MultipartFile file : files) {
            String fileName = file.getOriginalFilename();
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
            String filePath = "/Users/qms/upload/";
            fileName = UUID.randomUUID() + suffixName;
            File dest = new File(filePath + fileName);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String fullFileName = filePath + fileName;
            model.addAttribute("fullFileName:" + fullFileName);
            fullNames.add(fullFileName);
        }
        ResultVO resultVO = new ResultVO();
        resultVO.setCode(200);
        resultVO.setMessage("上传成功");
        resultVO.setBody(fullNames);
        return resultVO;
    }
  1. 参数文件混传,需要一个上传的Bean,Bean及方法如下:
 @PostMapping("/uploadAndLogin")
    public ResultVO<String> uploadAndLogin(UploadBean bean){
        System.out.println("userName:" + bean.getUserName());
        System.out.println("password:" + bean.getPassword());
        String fileName = bean.getFile().getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        String filePath = "/Users/qms/upload/";
        fileName = UUID.randomUUID() + suffixName;
        File dest = new File(filePath + fileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            bean.getFile().transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String fullFileName = filePath + fileName;
        ResultVO resultVO = new ResultVO();
        resultVO.setCode(200);
        resultVO.setMessage("上传成功");
        resultVO.setBody("成功:"+fullFileName);
        return resultVO;
    }
撸方法到此结束
到此,启动SpringBoot项目可以请求本机服务了。
Https请求
此处采用P12证书
  1. 证书生成:
keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

执行之后一步步往下走即可,别名为tomcat,可以自己修改,记住自己输入的密码,配置需要用到。

  1. 将生成的证书配置到SpringBoot项目的resources目录下keystore.p12
  2. 在application.properties配置项目:
#https相关的配置 
server.ssl.enabled=true
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=密码
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
到此Https配置结束
请求转发,代码配置如下:
@Configuration
public class HttpsConfig {

    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                 //添加  防止post请求转发出错
              collection.addMethod(DEFAULT_PROTOCOL);
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }

    private Connector createTomcatConnector() {
        Connector connector = new
                Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8085);
        return connector;
    }

}
配置结束
请求8080的http请求即可转发到8085的https请求。
源码

链接:源码

写在最后
到此结束,我们的测试服务已经写Ok了,其实也没多少内容,一个Controller搞定,
可以愉快地测试我们的网络服务了。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我来写一个springboot单元测试:@RunWith(SpringRunner.class) @SpringBootTest public class MyTest { @Test public void testSomething() { // 添加你的测试代码 }} ### 回答2: Spring Boot提供了许多实用工具来简化单元测试。下面是一个示例,展示了如何编写一个Spring Boot单元测试。 首先,我们需要确保我们的项目中已经包含了Spring Boot Test依赖。在pom.xml文件中添加以下代码: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` 接下来,我们创建一个简单的Spring Boot控制器类,如下所示: ```java @RestController public class HelloWorldController { @GetMapping("/hello") public String helloWorld() { return "Hello, World!"; } } ``` 现在我们可以编写一个单元测试类来测试这个控制器。创建一个新的Java类,命名为HelloWorldControllerTest: ```java @RunWith(SpringRunner.class) @SpringBootTest @WebMvcTest(HelloWorldController.class) public class HelloWorldControllerTest { @Autowired private MockMvc mockMvc; @Test public void testHelloWorld() throws Exception { mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello, World!")); } } ``` 在这个测试类中,我们使用了Spring Runner来运行测试,并使用@SpringBootTest注解启用Spring Boot的自动配置。使用@WebMvcTest注解我们关注的是HelloWorldController类。 在testHelloWorld方法中,我们使用MockMvc对象对"/hello"路径进行GET请求,并对返回的结果进行断言。我们预期返回的状态码应该是200,响应内容应该是"Hello, World!"。 以上就是一个基本的Spring Boot单元测试示例。运行这个测试类,如果一切顺利,测试将通过并打印出"Tests passed!"的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值