JavaWeb博客系统后端-封装统一返回结果
JavaWeb博客系统后端-系列
前面我们已经创建了项目,接下来我们应该写个接口来测试一下吧。
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!";
}
}
先看注解 - @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!";
}
}
其实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!";
}
}
是不是很灵活呀,当然是第一种写法比较简单,是吧!
好啦,写好了我们就运行一下吧!
测试接口
先把程序运行起来
看到这样子,就跑起来了
然后我们使用一个工具postMan
同学们可以去这里下载
好啦,这就是我们写的第一个接口了,并且访问成功了。
再大胆的尝试
我们尝试返回一个学生对象看看
再写一个接口,并且修改一下接口规范
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;
}
}
这次,我们添加了@RequestMapping("/test"),那么其里面的访问路径就变成这了
域名:端口/接口
比如说:
localhost:8080/test/hello
localhost:8080/test/student
这个是学生类:
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...
}
我们请求一下地址:
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...
}
做后台的同学呢,就要定义好状态码和对应的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;
}
运行,再次访问:
那我们每次都这样一个一个地去创建吗?
当然不!
所以我们继续优化代码
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...
}
那么我们就可以去使用了
@GetMapping("/student")
public ResponseResult getStudent(){
Student student = new Student("张三", "男", 27);
ResponseResult success = ResponseResult.SUCCESS();
success.setData(student);
return success;
}
既然有了成功的,有了失败的,那还得抽取出登陆失败呀,注册失败,登陆成功,获取文章成功....各种操作的状态,那怎么封装呢?同学们可以思考一下,或者后面看我们视频课程。