JavaWeb博客系统后端-封装统一返回结果

# JavaWeb博客系统后端-系列

JavaWeb博客系统后端-功能需求 (opens new window)

JavaWeb博客系统后端-项目创建 (opens new window)

前面我们已经创建了项目,接下来我们应该写个接口来测试一下吧。

ps:

有同学问我android开发里的网络访问,使用Php后台可不可以。当然可以啦,因为都是走http协议嘛。你使用java的后台也行,使用php的后台也可以,使用python的后台也行,go也行,跟编程语言没有关系。只要是使用http协议就行了。理解吗?

先来一个Helloworld吧!

我们的后台程序,没有页面。

所以我们写的时候,要让它返回json,或者xml

# 编写TestController

先来一个测试的controller吧,你可以理解Controller是一个入口。具体是怎么样子的,先跟着写吧,后面我们写完,跑通了,再回头来理解。

图片描述

package net.sunofbeaches.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@CrossOrigin
public class TestController {

    @GetMapping("/test")
    public String helloWorld() {
        return "hello world!";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

先看注解

  • @Controller,也就是表明这个类是视图控制器。因为我们的后台程序不需要视图(html页面)所以,我们再来一个@ResponseBody注解
  • @ResponseBody 返回一个实体
  • @Crossorigin 支持跨域,也就是支持另外一个域名访问这个接口
  • @GetMaping,请求方式,以及请求路径。

这里面的@GetMapping("/test"),请求路径就是localhost:8080/test

以后我们部署到服务器上,端口为80则可以省略

那么以后的访问路径则是www.blog.sunofbeach.net/test

这样子,就可以访问到了helloWorld这个方法了

扩展:你知道了@GetMapping,也就应该知道@PostMapping,@DeleteMapping,@PutMapping了吧。

继续扩展,为了方便,我们可以把@Controller和@ResponseBody使用这个注解代替:

package net.sunofbeaches.controller;


import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin
public class TestController {

    @GetMapping("/test")
    public String helloWorld() {
        return "hello world!";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

其实GetMapping,PutMapping....PostMapping这些的原始写法是这样子的:

package net.sunofbeaches.controller;


import org.springframework.web.bind.annotation.*;

@RestController
@CrossOrigin
public class TestController {

    @RequestMapping(value = "test",method = RequestMethod.GET)
    public String helloWorld() {
        return "hello world!";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

是不是很灵活呀,当然是第一种写法比较简单,是吧!

好啦,写好了我们就运行一下吧!

# 测试接口

先把程序运行起来

看到这样子,就跑起来了

图片描述

然后我们使用一个工具postMan

同学们可以去这里下载

模拟请求神器PostMan,一个不错的工具 (opens new window)

图片描述

好啦,这就是我们写的第一个接口了,并且访问成功了。

# 再大胆的尝试

我们尝试返回一个学生对象看看

再写一个接口,并且修改一下接口规范

package net.sunofbeaches.controller;


import net.sunofbeaches.pojo.Student;
import org.springframework.web.bind.annotation.*;

@RestController
@CrossOrigin
@RequestMapping("/test")
public class TestController {

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String helloWorld() {
        return "hello world!";
    }


    @GetMapping("/student")
    public Student getStudent(){
        Student student = new Student("张三", "男", 27);
        return student;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

这次,我们添加了@RequestMapping("/test"),那么其里面的访问路径就变成这了

域名:端口/接口

比如说:

localhost:8080/test/hello

localhost:8080/test/student

1
2
3
4

这个是学生类:

package net.sunofbeaches.pojo;

import java.io.Serializable;

public class Student implements Serializable {

    public Student(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    private String name;

    private String sex;

    private int age;

 ...get and setter...


}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

我们请求一下地址:

localhost:8080/test/student

图片描述

发现,返回了一个Json字符串,多好呀。前端解析一下不就可以显示出来了嘛。

# 思考

凭借着我们做android的经验,仅仅是数据是不够用的,还需要有状态,信息,状态码....数据,对吧!

比如说,我们以前在做喜马拉雅的项目,604表示网络出错的状态码。

所以我们也要进行一下封装,比如说:

package net.sunofbeaches.response;

public class ResponseResult {
    private String message;
    private boolean success;
    private int code;
    private Object data;

...get and setter...

}

1
2
3
4
5
6
7
8
9
10
11
12

做后台的同学呢,就要定义好状态码和对应的message作为辅助说明,比如说code=10000,message=“操作成功”,code=20000,message=“操作失败”

而success为两个值之一,true / false

data用于封装数据

所以,我们进一步修改一下代码就有了:

    @GetMapping("/student")
    public ResponseResult getStudent(){
        Student student = new Student("张三", "男", 27);
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(student);
        responseResult.setCode(10000);
        responseResult.setMessage("操作成功");
        responseResult.setSuccess(true);
        return responseResult;
    }
1
2
3
4
5
6
7
8
9
10

运行,再次访问:

图片描述

那我们每次都这样一个一个地去创建吗?

当然不!

所以我们继续优化代码

package net.sunofbeaches.response;

public class ResponseResult {

    public ResponseResult(String message, boolean success, int code) {
        this.message = message;
        this.success = success;
        this.code = code;
    }

    public static ResponseResult SUCCESS(){
        return new ResponseResult("操作成功", true, 10000);
    }

    public static ResponseResult SUCCESS(String message){
        return new ResponseResult(message, true, 10000);
    }
    
    public static ResponseResult FAILED(){
        return new ResponseResult("操作失败", false, 20000);
    }

    public static ResponseResult FAILED(String message){
        return new ResponseResult(message, false, 20000);
    }
    
    private String message;
    private boolean success;
    private int code;
    private Object data;

 ...getter and setter...
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

那么我们就可以去使用了

    @GetMapping("/student")
    public ResponseResult getStudent(){
        Student student = new Student("张三", "男", 27);
        ResponseResult success = ResponseResult.SUCCESS();
        success.setData(student);
        return success;
    }
1
2
3
4
5
6
7

既然有了成功的,有了失败的,那还得抽取出登陆失败呀,注册失败,登陆成功,获取文章成功....各种操作的状态,那怎么封装呢?同学们可以思考一下,或者后面看我们视频课程。

上次更新: 2022/03/28, 23:04:38