JavaWeb-RESTful(一)_RESTful初认识 传送门
JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上 传送门
JavaWeb-RESTful(三)_使用SpringMVC开发RESTful_下 传送门
Learn
一、单元测试:添加用户
二、单元测试:修改用户
三、单元测试:删除用户
四、SpringBoot默认处理异常路径
一、单元测试:添加用户
在MainController.java中添加addUser()添加用户的单元测试方法
@Test public void addUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Gary\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); }
给User实体对象设置三个熟悉,id、username、password
private String username; private String password; private String id;
通过id和username获得的试图都是简单试图,通过password获得的试图是复杂试图
@JsonView(UserSimpleView.class) public String getId() { return id; } @JsonView(UserSimpleView.class) public String getUsername() { return username; } @JsonView(UserDetailView.class) public String getPassword() { return password; }
在UserController.java中通过addUser()方法获得MainController.java中的addUser()的POST请求
@RequestMapping(value="/user",method= RequestMethod.POST) public User addUser(@RequestBody User user) { //传输json格式的时候,一定要记得加上@RequestBody注解 //输出 null System.out.println(user.getPassword()); //输出 Gary System.out.println(user.getUsername()); user.setId("1"); return user; }
package com.Gary.GaryRESTful; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GaryResTfulApplication { public static void main(String[] args) { SpringApplication.run(GaryResTfulApplication.class, args); } }
package com.Gary.GaryRESTful.controller; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; //这是SpringBoot测试类 @RunWith(SpringRunner.class) @SpringBootTest public class MainController { @Autowired private WebApplicationContext webApplicationContext; //SpringMV单元测试独立测试类 private MockMvc mockMvc; @Before public void before() { //创建独立测试类 mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } //@Test //查询user public void test() throws Exception { //发起一个Get请求 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user") .param("username", "Gary") //json的形式发送一个请求 .contentType(MediaType.APPLICATION_JSON_UTF8)) //期望服务器返回什么(期望返回的状态码为200) .andExpect(MockMvcResultMatchers.status().isOk()) //期望服务器返回json中的数组长度为3 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)) .andReturn().getResponse().getContentAsString(); System.out.println("查询简单试图"+str); } //@Test public void getInfo() throws Exception { //发起一个get请求,查看用户详情 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary")) .andReturn().getResponse().getContentAsString(); System.out.println("查询复杂试图"+str); } @Test public void addUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Gary\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); } }
package com.Gary.GaryRESTful.controller; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.Gary.GaryRESTful.dto.User; import com.fasterxml.jackson.annotation.JsonView; //表示这个Controller提供R二十天API @RestController public class UserController { @RequestMapping(value="/user",method = RequestMethod.GET) /* * default value 默认 * name 请求的名字 * required 是否是必须的,true * value 别名 * * */ @JsonView(User.UserSimpleView.class) public List<User> query(@RequestParam(name="username",required=false) String username) { System.out.println(username); //满足期望服务器返回json中的数组长度为3 List<User> list = new ArrayList<>(); list.add(new User()); list.add(new User()); list.add(new User()); return list; } @RequestMapping(value="/user/{id}",method= RequestMethod.GET) //将@PathVariable路径中的片段映射到java代码中 @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String id) { User user = new User(); user.setUsername("Gary"); return user; } @RequestMapping(value="/user",method= RequestMethod.POST) public User addUser(@RequestBody User user) { //传输json格式的时候,一定要记得加上@RequestBody注解 //输出 null System.out.println(user.getPassword()); //输出 Gary System.out.println(user.getUsername()); user.setId("1"); return user; } }
package com.Gary.GaryRESTful.dto; import com.fasterxml.jackson.annotation.JsonView; public class User { //简单试图 只有一个username public interface UserSimpleView{}; //复杂试图 有username 和 password public interface UserDetailView extends UserSimpleView{}; private String username; private String password; private String id; @JsonView(UserSimpleView.class) public String getId() { return id; } public void setId(String id) { this.id = id; } @JsonView(UserSimpleView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(UserDetailView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
二、单元测试:修改用户
在MainController.java中添加updataUser()修改用户的单元测试方法
//修改用户 @Test public void updataUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.put("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Garyary\",\"id\":\"1\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); }
在UserController.java中接收来自updataUser的请求
//修改用户资料 @RequestMapping(value="/user/{id}",method = RequestMethod.PUT) public User updataUser(@RequestBody User user) { System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); return user; }
package com.Gary.GaryRESTful; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GaryResTfulApplication { public static void main(String[] args) { SpringApplication.run(GaryResTfulApplication.class, args); } }
package com.Gary.GaryRESTful.controller; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; //这是SpringBoot测试类 @RunWith(SpringRunner.class) @SpringBootTest public class MainController { @Autowired private WebApplicationContext webApplicationContext; //SpringMV单元测试独立测试类 private MockMvc mockMvc; @Before public void before() { //创建独立测试类 mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } //@Test //查询user public void test() throws Exception { //发起一个Get请求 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user") .param("username", "Gary") //json的形式发送一个请求 .contentType(MediaType.APPLICATION_JSON_UTF8)) //期望服务器返回什么(期望返回的状态码为200) .andExpect(MockMvcResultMatchers.status().isOk()) //期望服务器返回json中的数组长度为3 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)) .andReturn().getResponse().getContentAsString(); System.out.println("查询简单试图"+str); } //@Test public void getInfo() throws Exception { //发起一个get请求,查看用户详情 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary")) .andReturn().getResponse().getContentAsString(); System.out.println("查询复杂试图"+str); } //添加用户 //@Test public void addUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Gary\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); } //修改用户 @Test public void updataUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.put("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Garyary\",\"id\":\"1\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); } }
package com.Gary.GaryRESTful.controller; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.Gary.GaryRESTful.dto.User; import com.fasterxml.jackson.annotation.JsonView; //表示这个Controller提供R二十天API @RestController public class UserController { @RequestMapping(value="/user",method = RequestMethod.GET) /* * default value 默认 * name 请求的名字 * required 是否是必须的,true * value 别名 * * */ @JsonView(User.UserSimpleView.class) public List<User> query(@RequestParam(name="username",required=false) String username) { System.out.println(username); //满足期望服务器返回json中的数组长度为3 List<User> list = new ArrayList<>(); list.add(new User()); list.add(new User()); list.add(new User()); return list; } @RequestMapping(value="/user/{id}",method= RequestMethod.GET) //将@PathVariable路径中的片段映射到java代码中 @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String id) { User user = new User(); user.setUsername("Gary"); return user; } @RequestMapping(value="/user",method= RequestMethod.POST) public User addUser(@RequestBody User user) { //传输json格式的时候,一定要记得加上@RequestBody注解 //输出 null System.out.println(user.getPassword()); //输出 Gary System.out.println(user.getUsername()); user.setId("1"); return user; } //修改用户资料 @RequestMapping(value="/user/{id}",method = RequestMethod.PUT) public User updataUser(@RequestBody User user) { System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); return user; } }
package com.Gary.GaryRESTful.dto; import com.fasterxml.jackson.annotation.JsonView; public class User { //简单试图 只有一个username public interface UserSimpleView{}; //复杂试图 有username 和 password public interface UserDetailView extends UserSimpleView{}; private String username; private String password; private String id; @JsonView(UserSimpleView.class) public String getId() { return id; } public void setId(String id) { this.id = id; } @JsonView(UserSimpleView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(UserDetailView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
三、单元测试:删除用户
在MainController.java中添加deleteUser()修改用户的单元测试方法
//删除用户 @Test public void deleteUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()); }
在UserController.java中接收来自deleteUser的请求
@RequestMapping(value="/user/{id}",method = RequestMethod.DELETE) public User deleteUser(@PathVariable String id) { System.out.println(id); return null; }
package com.Gary.GaryRESTful; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GaryResTfulApplication { public static void main(String[] args) { SpringApplication.run(GaryResTfulApplication.class, args); } }
package com.Gary.GaryRESTful.controller; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; //这是SpringBoot测试类 @RunWith(SpringRunner.class) @SpringBootTest public class MainController { @Autowired private WebApplicationContext webApplicationContext; //SpringMV单元测试独立测试类 private MockMvc mockMvc; @Before public void before() { //创建独立测试类 mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } //@Test //查询user public void test() throws Exception { //发起一个Get请求 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user") .param("username", "Gary") //json的形式发送一个请求 .contentType(MediaType.APPLICATION_JSON_UTF8)) //期望服务器返回什么(期望返回的状态码为200) .andExpect(MockMvcResultMatchers.status().isOk()) //期望服务器返回json中的数组长度为3 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)) .andReturn().getResponse().getContentAsString(); System.out.println("查询简单试图"+str); } //@Test public void getInfo() throws Exception { //发起一个get请求,查看用户详情 String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary")) .andReturn().getResponse().getContentAsString(); System.out.println("查询复杂试图"+str); } //添加用户 //@Test public void addUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Gary\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); } //修改用户 //@Test public void updataUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.put("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8) .content("{\"username\":\"Garyary\",\"id\":\"1\"}")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1")); } //删除用户 @Test public void deleteUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/user/1") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()); } }
package com.Gary.GaryRESTful.controller; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.Gary.GaryRESTful.dto.User; import com.fasterxml.jackson.annotation.JsonView; //表示这个Controller提供R二十天API @RestController public class UserController { @RequestMapping(value="/user",method = RequestMethod.GET) /* * default value 默认 * name 请求的名字 * required 是否是必须的,true * value 别名 * * */ @JsonView(User.UserSimpleView.class) public List<User> query(@RequestParam(name="username",required=false) String username) { System.out.println(username); //满足期望服务器返回json中的数组长度为3 List<User> list = new ArrayList<>(); list.add(new User()); list.add(new User()); list.add(new User()); return list; } @RequestMapping(value="/user/{id}",method= RequestMethod.GET) //将@PathVariable路径中的片段映射到java代码中 @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String id) { User user = new User(); user.setUsername("Gary"); return user; } @RequestMapping(value="/user",method= RequestMethod.POST) public User addUser(@RequestBody User user) { //传输json格式的时候,一定要记得加上@RequestBody注解 //输出 null System.out.println(user.getPassword()); //输出 Gary System.out.println(user.getUsername()); user.setId("1"); return user; } //修改用户资料 @RequestMapping(value="/user/{id}",method = RequestMethod.PUT) public User updataUser(@RequestBody User user) { System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); return user; } //删除 @RequestMapping(value="/user/{id}",method = RequestMethod.DELETE) public User deleteUser(@PathVariable String id) { //输出删除的用户 可以查看JUnit中的状态吗 System.out.println(id); return null; } }
package com.Gary.GaryRESTful.dto; import com.fasterxml.jackson.annotation.JsonView; public class User { //简单试图 只有一个username public interface UserSimpleView{}; //复杂试图 有username 和 password public interface UserDetailView extends UserSimpleView{}; private String username; private String password; private String id; @JsonView(UserSimpleView.class) public String getId() { return id; } public void setId(String id) { this.id = id; } @JsonView(UserSimpleView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(UserDetailView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
在UserController.java中通过@RequestMapping("/user")映射来处理所有user请求,使代码变得简介一些
package com.Gary.GaryRESTful.controller; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.Gary.GaryRESTful.dto.User; import com.fasterxml.jackson.annotation.JsonView; //表示这个Controller提供R二十天API @RestController @RequestMapping("/user") public class UserController { //@RequestMapping(value="/user",method = RequestMethod.GET) /* * default value 默认 * name 请求的名字 * required 是否是必须的,true * value 别名 * * */ @GetMapping @JsonView(User.UserSimpleView.class) public List<User> query(@RequestParam(name="username",required=false) String username) { System.out.println(username); //满足期望服务器返回json中的数组长度为3 List<User> list = new ArrayList<>(); list.add(new User()); list.add(new User()); list.add(new User()); return list; } //@RequestMapping(value="/user/{id}",method= RequestMethod.GET) //将@PathVariable路径中的片段映射到java代码中 @GetMapping("/{id}") @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String id) { User user = new User(); user.setUsername("Gary"); return user; } //添加用户 //@RequestMapping(value="/user",method= RequestMethod.POST) @PostMapping public User addUser(@RequestBody User user) { //传输json格式的时候,一定要记得加上@RequestBody注解 //输出 null System.out.println(user.getPassword()); //输出 Gary System.out.println(user.getUsername()); user.setId("1"); return user; } //修改用户资料 //@RequestMapping(value="/user/{id}",method = RequestMethod.PUT) @PutMapping("/{id}") public User updataUser(@RequestBody User user) { System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); return user; } //删除 //@RequestMapping(value="/user/{id}",method = RequestMethod.DELETE) @DeleteMapping("/{id}") public User deleteUser(@PathVariable String id) { //输出删除的用户 可以查看JUnit中的状态吗 System.out.println(id); return null; } }
四、SpringBoot默认处理异常路径
在项目static->error目录下创建一个404.html,运行项目
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>404页面</title> </head> <body> <h1>404错误,你的页面找不到了!!!</h1> </body> </html>