前言

刚开始接触SpringBoot,查阅了一些关于接口的文章,如果有写的不对的地方,欢迎批评指正~

注解

1.@RestController

@RestController出现的频率很高,那它到底是什么意思呢?

Spring中 @RestController 的作用等同于@Controller + @ResponseBody 所以要理解@RestController注解还得了解@Controller 和 @ResponseBody的注解

@Controller
@Controller是一种特殊化的@Component类,在实际操作中@Controller用来表示Spring某个类是否可以接受HTTP请求,它通常与@ResponseBody绑定使用。

@Component
1.把普通POJO(Plain Ordinary Java Object简单的java对象)实例化到spring容器中,相当于配置文件中的

2.泛指组件,当组件不好归类的时候,可以使用@Component注解进行标注

@ResponseBody
在实际操作中我们只需要在Controller层使用@RequestBody注解就可以将对象进行反序列化;而若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody;也可以将@ResponseBody注解在Controller类上,这样可以将这个类中所有的方法序列化。

总结:
1.@RestController为开发提供了方便,在提供json接口时需要的配置操作再也不需要自己配置了
2.@RestController注解相当于@ResponseBody和@Controller的结合
3.@RestController注解时,返回的是内容实例

2.@RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。

@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

请求相关

这里尝试写一个请求

@RestController
public class UserController {@RequestMapping("/getUserInfo")public Map<String, Object> getUserInfo() {Map<String, Object> map = new HashMap<>();map.put("account", "123");map.put("name", "张三");return map;}
}

备注:
1.ip地址是本机IPv4 地址
2.RequestMapping 这里不管是post请求还是get 请求都是一样的返回值

post请求

定义一个Person实体类

public class Person {private long id;private String name;private int age;private String hobby;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "name:" + name + ";age=" + age + ";hobby:" + hobby;}
}

在之前的UserController类里面添加如下方法:

@PostMapping(path = "/setUserInfo")public String setUserInfo(Person person) {System.out.println(person.toString());return person.toString();}

效果如下:

备注:
但是发现 postMan 采用 raw 方式
data如下:
{
“name”:“lxc”,
“age”:13,
“hobby”:“test”
}

返回的结果:name:null;age=0;hobby:null

如何接受json数据

新写一个接口如下:

  @PostMapping(path = "/setUserInfo2")public String setUserInfo2(@RequestBody Person person) {return person.toString();
}

备注:需要修改请求头的content-Type 为application/json

上传文件

这里直接贴代码

package com.example.demo;import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;@RestController
public class FileUploadController {@PostMapping("/singleFile")@ResponseBodypublic String singleFile(@RequestParam("file") MultipartFile file) {//判断非空if (file.isEmpty()) {return "上传的文件不能为空";}try {String path = "D:\\Program Files\\upload\\";
//            Log.info(this.getClass().getName() + "图片路径:" + path);File f = new File(path);//如果不存在该路径就创建if (!f.exists()) {f.mkdir();}File dir = new File(path + file.getOriginalFilename());// 文件写入file.transferTo(dir);return "上传单个文件成功";} catch (Exception e) {e.printStackTrace();return "上传单个文件失败";}}//文件下载相关代码@RequestMapping("/download")public String downloadFile(HttpServletRequest request, HttpServletResponse response) {String fileName = "test.txt";// 设置文件名,根据业务需要替换成要下载的文件名if (fileName != null) {//设置文件路径String realPath = "D://Program Files//upload";File file = new File(realPath, fileName);if (file.exists()) {response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;try {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}System.out.println("success");} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}}return null;}
}


这里只是简单的举例子,当然还有多文件上传等,这个可以之后去慢慢摸索…emm…

参数校验

统一的返回结果

有时候需要统一处理返回结果,这里简单写个例子

package com.example.demo.result;import java.io.Serializable;/*** 统一的返回结果集*/
public class JsonResult implements Serializable {// 成功public static final int SUCCESS = 0;// 失败public static final int FAIL = 1;private int status;private int code;private String msg;private Object data;public JsonResult(int status, int code, String msg, Object data) {this.status = status;this.code = code;this.msg = msg;this.data = data;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static JsonResult success(Object data) {return new JsonResult(SUCCESS, 200, "ok", data);}public static JsonResult success(String msg) {return new JsonResult(SUCCESS, 200, msg, null);}public static JsonResult fail(String msg) {return fail(400, msg);}public static JsonResult fail(int code, String msg) {return new JsonResult(FAIL, code, msg, null);}}

创建测试用户类

package com.example.demo.user;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotNull;
import java.io.Serializable;public class User implements Serializable {@Length(min = 5, max = 10, message = "用户名长度不合法")@NotNull(message = "用户名不能为空")private String username;@Length(min = 6, max = 16, message = "密码长度不合法")@NotNull(message = "密码不能为空")private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

UserController新增测试接口

    @PostMapping("/login")public JsonResult login(@Validated @RequestBody User user) {return JsonResult.success("登陆成功");}//测试get请求@GetMapping("/getLogin")public JsonResult getLogin(@Validated User user, BindingResult bindingResult){if(bindingResult.hasErrors()){return JsonResult.fail(bindingResult.getFieldError().getDefaultMessage());}return JsonResult.success("登陆成功");}

统一的异常处理

package com.example.demo.exception;import com.example.demo.result.JsonResult;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolationException;@RestControllerAdvice
public class GlobalExceptionHandler {/*** post请求参数校验抛出的异常** @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)public JsonResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {//获取异常中随机一个异常信息System.out.println("methodArgumentNotValidExceptionHandler");String defaultMessage = e.getBindingResult().getFieldError().getDefaultMessage();return JsonResult.fail(defaultMessage);}/*** get请求参数校验抛出的异常** @param e* @return*/@ExceptionHandler(BindException.class)public JsonResult bindExceptionHandler(BindException e) {System.out.println("bindExceptionHandler");//获取异常中随机一个异常信息String defaultMessage = e.getBindingResult().getFieldError().getDefaultMessage();return JsonResult.fail(defaultMessage);}/*** 请求方法中校验抛出的异常** @param e* @return*/@ExceptionHandler(ConstraintViolationException.class)public JsonResult constraintViolationExceptionHandler(ConstraintViolationException e) {//获取异常中第一个错误信息System.out.println("constraintViolationExceptionHandler");String message = e.getConstraintViolations().iterator().next().getMessage();return JsonResult.fail(message);}}

常用校验注解

@Null  被注释的元素必须为null
@NotNull  被注释的元素不能为null
@AssertTrue  被注释的元素必须为true
@AssertFalse  被注释的元素必须为false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)  被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty  被注释的字符串必须非空
@Range  被注释的元素必须在合适的范围内

自定义校验

有时候需求复杂,需要自己去写一个

package com.example.demo.verify;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
//用于校验手机号的逻辑类
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {//手机号的校验格式String regexp() default "^[1][3-9][0-9]{9}$";//出现错误返回的信息String message() default "手机号格式错误";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })@Retention(RUNTIME)@Documentedpublic @interface List {Phone[] value();}
}
package com.example.demo.verify;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;//校验注解的类必须实现ConstraintValidator,第一个泛型是注解,第二个泛型是校验参数的类型(手机号是String类型)
public class PhoneValidator implements ConstraintValidator<Phone, String> {private String regexp;//初始化方法@Overridepublic void initialize(Phone constraintAnnotation) {//获取校验的手机号的格式this.regexp = constraintAnnotation.regexp();}//value是@Phone注解所注解的字段值//校验,返回true则通过校验,返回false则校验失败,错误信息为注解中的message@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (value == null) {return true;}return value.matches(regexp);}
}
package com.example.demo;import com.example.demo.result.JsonResult;
import com.example.demo.verify.Phone;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.constraints.NotNull;@RestController
@Validated
public class PhoneController {@GetMapping("/sendPhone")public JsonResultsendPhone(@Phone @NotNull(message = "手机号不能为空") String phone) {return JsonResult.success("正确的手机号");}
}

分组校验

在上面的测试用户类新增两个接口

   public interface CheckName {}public interface CheckPassword {}

修改属性的groups

 @Length(min = 5, max = 10, message = "用户名长度不合法", groups = CheckName.class)@NotNull(message = "用户名不能为空")private String username;@Length(min = 6, max = 16, message = "密码长度不合法", groups = CheckPassword.class)@NotNull(message = "密码不能为空")private String password;

修改UserController类下的login进行测试

    @PostMapping("/login")public JsonResult login(@Validated(value = User.CheckName.class) @RequestBody User user) {return JsonResult.success("登陆成功");}

我们会发现密码的校验没有进行

SpringBoot 请求相关相关推荐

  1. java springcloud面试题_JAVA语言之springboot+springcloud相关面试题

    本文主要向大家介绍了JAVA语言之springboot+springcloud相关面试题,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 什么是springboot 用来简化sprin ...

  2. android危险权限分组,Android 6.0权限请求相关及权限分组方法

    Android M(6.0)API 23后加入了权限请求设置,APP需要使用某些权限需要主动申请. 权限分为3类,一组是Normal权限,无需申请,另一组是Dangerous,需申请,然后是特殊权限, ...

  3. php语法------04 php内置函数之与页面表单请求相关的内置函数对象

    2019独角兽企业重金招聘Python工程师标准>>> $_SERVER:服务器相关的信息 $_REQUEST:请求相关的信息(表单数据,不管是GET方式提交还是POST方式提交) ...

  4. CKFinder3.5.1免费和整合springboot等相关bug修复

    CKFinder3.5.1免费和整合springboot等相关bug修复 前言 项目本身bug修复 ■ 流异常 ■ 整合springboot相关bug 免费过程 ■ 代码可读化 ① 初步整理 ② 大致 ...

  5. nuxt3.0学习-二、nuxt3.0的请求相关内容、状态管理(useState/Pinia)、cookie管理(useCookie)、token续期

    请求相关内容 nuxt3.0提供的多种数据访问 API 上一次是nuxt3.0的安装和约定式的使用 接下来就是使用请求调整,Nuxt3 中提供的多种数据访问 API: $fetch: 使用时机: 首屏 ...

  6. springboot+springcloud相关问题

    什么是springboot1.用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)2.创建独立的spring引用程序 main方法运行3.创建独 ...

  7. springboot 请求路径有后缀_SpringBoot中配置Web静态资源路径的方法

    介绍: 本文章主要针对web项目中的两个问题进行详细解析介绍:1- 页面跳转404,即controller转发无法跳转页面问题:2- 静态资源文件路径问题. 项目工具: Intelij Idea, J ...

  8. [附源码]计算机毕业设计SpringBoot计算机相关专业考研资料管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. django 使用requests请求相关接口

    1.如果是get请求接口,并且需要带相关参数的话,可以借鉴下面的代码: import requestsfrom django.http import JsonResponsedef get_info( ...

  10. springboot+springcloud相关面试题

    什么是springboot         用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)                  创建独立的s ...

最新文章

  1. linux虚拟网络设备之bridge(桥)(三)
  2. linux下的各种系统错误errno描述一览
  3. Apache 服务器存在高危提权漏洞,请升级至最新版本 2.4.39
  4. 在同一个机器上布署两个JBOSS,要修改那些端口?
  5. TCP同步和异步连接_学习笔记
  6. 控制文件夹递归深度_TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)...
  7. 源码-0105-Autoresizing
  8. php版canvas,PHP实现将HTML5中Canvas图像保存到服务器
  9. [转]windows 2003 开启远程桌面
  10. Java数据结构:稀疏数组(Sparse Array)的创建和文件存取
  11. 翻译: 2深度学习的基础技能 概览
  12. 计算机科学的方法论有三个过程,计算机科学与技方法论3.ppt
  13. java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
  14. 按键精灵post请求_[教程] 以本论坛为例,手把手教你使用按键精灵POST登陆网页...
  15. matlab 输出两列,Matlab绘制两列正弦波的叠加
  16. 度歌虎山寨搜索引擎创始人竟是“90后”
  17. linux加载和卸载驱动模块出现 'XXX': device or resource busy 错误提示
  18. 小程序-实现列表- 搜索功能的实现(6)
  19. Base64在线加密解密
  20. 记录一下学习嵌入式的方法和小窍门

热门文章

  1. 《此生未完成》读后感
  2. php将tiff转pdf_通过命令行界面将PDF,TIFF和其他图像格式批量转换为PDF,PDF可搜索和具有Power PDF Advanced的TIFF...
  3. oracle删除不了同义词,删除同义词,百科如何删除同义词项
  4. 中序线索化二叉树的遍历
  5. 利用 Python 实现简单的基于用户的商品推荐模型
  6. 计算机网络设计大赛总结,计算机技能大赛总结#.doc
  7. SpringCloud 学习笔记 前端(二) ES6语法相关介绍
  8. 网页原型设计工具设计_网页设计工具从下往下
  9. Android视频列表自动播放功能
  10. mysql设置不区分大小写_更改MYSQL数据库不区分大小写表名