最近在弄监控主机项目,对javaweb又再努力学习。实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据展示成了一种固定的开发模式。像thymeleaf这种东西没法实现前后端分离模板难学也只有写java的才用吧,还是用js模板引擎接受json好。

1. Json报文

SpringBoot 默认会使用 Json 作为响应报文格式。首先,我们创建一个 UserController 用于处理前端的 Web 请求。
定义一个简单的控制器,与通常返回 Url 的 Controller 不一样的是,login() 使用了 @ResponseBody 注解,它表示此接口响应为纯数据,不带任何界面展示,可以获得标准Json

  1. @Controller //等同于springmvc @Controller 可以返回字符串 跳转至jsp等页面
  2. @RequestMapping("/user")
  3. public class UserController {
  4.  
  5. @RequestMapping("/login")
  6. @ResponseBody
  7. public RespEntity login(@RequestBody ReqUser reqUser) { //使用reqUser模型来接受,而不用User,实现 接收数据和实体的解耦和
  8.  
  9. User user = new User();
  10. if(reqUser != null) {
  11. user.setName(reqUser.getName());
  12. user.setPassword(reqUser.getPassword());
  13. }
  14.  
  15. return new RespEntity(RespCode.SUCCESS, user); //返回的响应实体具体看下节
  16. }
  17. }

【注】:

使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面

若返回json等内容到页面,则需要加@ResponseBody注解

对于上面的代码来说,还可以做进一步的优化,由于所有的 Restful 接口都只是返回数据,所以我们可以直接在类级别上添加 @ResponseBody 注解。而大多数情况下,@Controller 与 @ResponseBody 又会一起使用,所以我们使用 @RestController 注解来替换掉它们,从而更加简洁地实现功能。

2. 接口规范

对于每一家公司来说,都会定义自己的数据规范,一个统一且标准的数据规范对于系统维护来说是非常重要的,也在很在程度上提升了开发效率。

2.1 响应报文规范

接口响应至少需要告诉使用方三项信息:状态码、描述、数据。其中,数据不是每个接口必须的,如果只是一个简单修改的动作,可能就没有必须返回数据了。下面我们定义一个 RespEntity类来封装我们的响应报文model:

  1. public class RespEntity {
  2. private int code;
  3. private String msg;
  4. private Object data;
  5.  
  6. public RespEntity(RespCode respCode) {
  7. this.code = respCode.getCode();
  8. this.msg = respCode.getMsg();
  9. }
  10.  
  11. public RespEntity(RespCode respCode, Object data) {
  12. this(respCode);
  13. this.data = data;
  14. }
  15.  
  16. ...
  17. }

同时,定义一个枚举类来维护我们的状态码:

  1. public enum RespCode {
  2.  
  3. SUCCESS(0, "请求成功"),
  4. WARN(-1, "网络异常,请稍后重试");
  5.  
  6. private int code;
  7. private String msg;
  8.  
  9. RespCode(int code, String msg) {
  10. this.msg = msg;
  11. }
  12.  
  13. public int getCode() {
  14. return code;
  15. }
  16. public String getMsg() {
  17. return msg;
  18. }
  19. }

这样,我们的响应数据规范已基本建立。

2.2 请求数据规范

响应报文格式我们已经定义好了,那么请求数据我们如何接收呢?
一般来说,请求与响应会使用相同的报文形式。如果响应为Json,那么请求也建议使用Json。
为登录请求添加输入参数,首先,需要我们定义好用户实体User类,直接在映射方法login() 使用该实体进行参数接收,并将接收到的参数直接返回,1.节代码已实现。
调出Postman,(参考 postman 入门使用:https://www.cnblogs.com/yelao/p/9836252.html

填写正确的Url,选择POST方式发送请求,选择Body,将 Content-Type 设置成 application/json,填入 Json 格式的请求数据,点击 Send 即可得到如下结果。

数据接收非常成功,但在上面的响应报文中,存在着了一个非常严重的问题,那就是用户的密码也随同用户信息一起返回给了客户端,显然这并不是一种正确的做法。
我们需要对其进行一次过滤,由于 SpringBoot 默认使用 Jackson 作为 Json 序列化工具,如果想要过滤掉响应中的某些字段,只需在过滤字段对应的 get 方法上加上 @JsonIgnore 注解即可。
但这样又会引发另外一个问题,那就是请求中的字段也被过滤掉了,对于这种问题,可以采用抽离请求参数模型的方式进行处理,即自定义一套参数接收的 Model,比如,接收用户登录的会使用 ReqUser 来进行参数接收,这样使得请求参数模型与数据库映射实体完全分离,在一定程度上提升了系统的安全性。替换成 Model 对象后(1.节的代码已经替换好了),我们就可以在数据库映射实体 User 上增加 @JsonIgnore 注解忽略该字段的序列化,而不影响请求参数的输入。

3. 参数校验

出于系统健壮性的考虑,我们需要对所有的参数进行必要性校验,如:登录请求时,如果没有用户名,程序应该立即驳回该请求。上面请求参数模型(Model)的抽象也使得我们对数据校验更加方便,当然主要还是依赖于 SpringBoot 的 Validate 功能的强大支持。

3.1. 简单参数校验

对于登录接口来说,用户名与密码都是必输的,那么我们现在为其添加上对应的参数校验,无需 if-else 判断,简单的几个注解就可以帮助我们完成所有的工作。

  1. public class LoginController {
  2.  
  3. @RequestMapping("/login")
  4. @ResponseBody
  5. public RespEntity login(@RequestBody @Valid ReqUser reqUser) {
  6.  
  7. }
  8. }
  9. ----
  10. public class ReqUser {
  11. @NotBlank(message = "用户名不能为空")
  12. public String getName() {
  13. return name;
  14. }
  15.  
  16. @NotBlank(message = "密码不能为空")
  17. public String getPassword() {
  18. return password;
  19. }
  20. ...
  21. }

我们为请求参数的 Model 对象ReqUser 加上了 @Valid 注解,并在 Model 类中对需要校验字段的 get 方法上添加相应的校验注解。效果如下:

3.2. 复杂参数校验

  • 正则表达式校验
    如果用户的登录名为手机号,那么就需要对登录名的格式做进一步的校验,下面使用正则表达式来校验手机号的合法性。
  1. @NotBlank(message = "用户名不能为空")
  2. @Pattern(
  3. regexp = "1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}",
  4. message = "手机号格式不合法"
  5. )
  6. public String getUsername() {
  7. return username;
  8. }
  • 自定义校验注解
    在系统使用过程中,有很多地方需要对手机号的格式进行校验,如:注册、验证码发送等。
    但校验手机号的正则表达式又过于复杂,如果多处编写,一旦运营商增加某个号段,对程序的维护人员来说就是一个噩耗。这时,可以使用自定义校验注解来代替这些常用的校验。

手机号校验注解 Phone:

  1. @Constraint(validatedBy = PhoneValidator.class)
  2. @Target({ElementType.METHOD, ElementType.FIELD})
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. public @interface Phone {
  6.  
  7. String message() default "手机号格式不合法";
  8.  
  9. Class<?>[] groups() default {};
  10.  
  11. Class<? extends Payload>[] payload() default {};
  12.  
  13. }

手机号校验实现类 PhoneValidator:

  1. public class PhoneValidator implements ConstraintValidator<Phone, String> {
  2.  
  3. private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}");
  4.  
  5. @Override
  6. public void initialize(Phone phone) {
  7. }
  8.  
  9. @Override
  10. public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
  11. return pattern.matcher(value).matches();
  12. }
  13. }

Model 上的使用:

  1. @Phone
  2. public String getUsername() {
  3. return username;
  4. }

这样的话,如果因为某些不可抗拒因素导致校验规则的变动,只需要修改一处理即可,维护成本大大降低。

4. Xml 报文

大多数情况下,使用 Json 就可以满足我们的需求了,但仍然存在某些特定的场景需要使用到 XML 形式的报文,如:微信公众号开发。不过不用担心,切换成 XML 报文也只需要做轻微的改动,添加相关依赖如下:"com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.8"
然后就可以开始进行测试了,此处借助一个模拟 HTTP 请求工具(Postman)来协助我们测试该接口:

在上面的测试范例里,我们指定了 Accept 为 text/xml,这样 SpringBoot 就会返回 XML 形式的数据。

spring-boot json数据交互的更多相关文章

  1. Spring MVC之JSON数据交互和RESTful的支持

    1.JSON概述 1.1 什么是JSON JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式.它是基于JavaScript的一个子集,使用了C.C ...

  2. 1.4(Spring MVC学习笔记)JSON数据交互与RESTful支持

    一.JSON数据交互 1.1JSON简介 JSON(JavaScript Object Notation)是一种数据交换格式. 1.2JSON对象结构 {}代表一个对象,{}中写入数据信息,通常为ke ...

  3. Spring MVC 前后台数据交互

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址地址:<Spring MVC 前后台数据交互> 1.服务端数据到客户端 (1)返回页面,Controller中方法 ...

  4. Spring Boot的数据访问:CrudRepository接口的使用

    示例 使用CrudRepository接口访问数据 创建一个新的Maven项目,命名为crudrepositorytest.按照Maven项目的规范,在src/main/下新建一个名为resource ...

  5. springMVC学习(11)-json数据交互和RESTful支持

    一.json数据交互: json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. springMVC进行json交 ...

  6. springmvc-高级参数绑定-映射-异常-json数据交互-拦截器

    1.1. 高级参数绑定 1.1.1. 复制工程 把昨天的springmvc-web工程复制一份,作为今天开发的工程 复制工程,如下图: 粘贴并修改工程名为web2,如下图: 工程右键点击,如下图: 修 ...

  7. json数据交互

    springmvc 的json数据交互 - 哎幽的成长 - CSDN博客--和老师讲课相同http://blog.csdn.net/u012373815/article/details/4720818 ...

  8. SpringMVC JSON数据交互

    本节内容: @RequestBody @ResponseBody 请求json,响应json实现 前端可以有很多语言来写,但是基本上后台都是java开发的,除了c++(开发周期长),PHP和#Net( ...

  9. SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器

    一.参数的传递 1.简单的参数传递 /* @RequestParam用法:入参名字与方法名参数名不一致时使用{ * value:传入的参数名,required:是否必填,defaultValue:默认 ...

随机推荐

  1. mass create DN

    RUN VL10 in the background. http://paperstreetenterprises.com/running-vl10-background/ VL10*开头的TCODE ...

  2. docker network基础

    前面介绍了nginx与php两个容器间是如何进行通信的: [root@docker ~]# docker run -d --name=php -v /www:/usr/local/nginx/html ...

  3. Vue中table表头合并的用法

    <div class="panel-container"> <div> <table class="table-head" wid ...

  4. SpringMVC的工作流程、组件说明以及常用注解说明

    1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...

  5. day28元类与异常查找

    元类与异常处理1. 什么是异常处理    异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常    没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止    异常包含三个部分: ...

  6. android toolbar效果4

    两个标题的,右边一个按钮 activity_main.xml: <android.support.v7.widget.Toolbar style="style/toolbarStyle ...

  7. Logstash使用grok插件解析Nginx日志

    grok表达式的打印复制格式的完整语法是下面这样的: %{PATTERN_NAME:capture_name:data_type}data_type 目前只支持两个值:int 和 float. 在线g ...

  8. ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  9. tomcat8做成windows服务

  10. Jquery中的 Deferred分析

    参考:https://www.idaima.com/a/1627.html http://www.cnblogs.com/aaronjs/p/3356505.html 未完!