接口映射注解:
@Controller
:修饰class,用来创建处理http请求的对象@RestController
:Spring4之后加入的注解,原来在@Controller
中返回json需要@ResponseBody
来配合,如果直接用@RestController
替代@Controller
就不需要再配置@ResponseBody
,默认返回json格式。@RequestMapping
:配置url映射
参数绑定注解:
@PathVariable
:路径参数绑定@ModelAttribute
:表单模型参数绑定(不支持json)@RequestParam
:单个表单参数绑定@RequestBody
:接收payload方式提交的json数据
User实体定义:
@Data
public class User implements Serializable {
private static final long serialVersionUID = 3629821168587550808L;
private Long id;
private String name;
private Integer age;
}
User对象操作接口:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
// 构建一个线程安全的Map存放User对象
private static Map<Long, User> userHolder = Collections.synchronizedMap(new HashMap<Long, User>());
/**
* 处理"/user/getUsers"的GET请求,用来获取用户列表
* 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递
*
* @return
*/
@RequestMapping(value = "/getAll", method = RequestMethod.GET)
public List<User> getAllUser() {
List<User> users = new ArrayList<User>(userHolder.values());
return users;
}
/**
* 处理"/user/addUser1"的POST请求,用来创建User
*
* @ModelAttribute 用于接收表单提交的模型参数
* @RequestParam 用于接收表单提交的单个参数
*
* @param user
* @return
*/
@RequestMapping(value = "/addUser1", method = RequestMethod.POST)
public String postUser1(@ModelAttribute User user) {
log.info("Add user params: " + user);
userHolder.put(user.getId(), user);
return "success";
}
/**
* 处理"/user/addUser2"的POST请求,用来创建User
*
* @RequestBody 只接收Payload方式提交的json数据
*
* @param user
* @return
*/
@RequestMapping(value = "/addUser2", method = RequestMethod.POST)
public String postUser2(@RequestBody User user) {
log.info("Add user params: " + user);
userHolder.put(user.getId(), user);
return "success";
}
/**
* 处理"/user/getById/{id}"的GET请求,用来获取url中id值的User信息
* url中的id可通过@PathVariable绑定到函数的参数中
*
* @param id
* @return
*/
@RequestMapping(value = "/getById/{id}", method = RequestMethod.GET)
public User getUser(@PathVariable Long id) {
return userHolder.get(id);
}
/**
* 处理"/user/updateById/{id}"的PUT请求,用来更新User信息
*
* @param id
* @param user
* @return
*/
@RequestMapping(value = "/updateById/{id}", method = RequestMethod.PUT)
public String putUser(@PathVariable Long id, @RequestBody User user) {
log.info("update user params: " + user);
User u = userHolder.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
userHolder.put(id, u);
return "success";
}
/**
* 处理"/user/deleteById/{id}"的DELETE请求,用来删除User
*
* @param id
* @return
*/
@RequestMapping(value = "/deleteById/{id}", method = RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id) {
userHolder.remove(id);
return "success";
}
}
Rest接口测试用例:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
private RestTemplate restTemplate = new RestTemplate();
private final String baseurl = "http://127.0.0.1:8090/user";
private final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
@Test
public void getAllUser() {
String jsonStr = restTemplate.getForObject(baseurl + "/getAll", String.class);
List<User> users = gson.fromJson(jsonStr, new TypeToken<List<User>>() {}.getType());
System.out.println(users);
}
@Test
public void postUser() {
// 表单提交方式
HttpHeaders headers = new HttpHeaders();
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("id", "1");
params.add("name", "Jack");
params.add("age", "23");
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(baseurl + "/addUser1", entity, String.class);
System.out.println(responseEntity.getBody());
// json提交方式
User user = new User();
user.setAge(19);
user.setName("Tom");
user.setId(2l);
String result = restTemplate.postForObject(baseurl + "/addUser2", user, String.class);
System.out.println(result);
}
@Test
public void getUser() {
Map<String, Object> param = new HashMap<>();
param.put("id", 1l);
User user = restTemplate.getForObject(baseurl + "/getById/{id}", User.class, param);
System.out.println(user);
}
@Test
public void putUser() {
User user = new User();
user.setId(1l);
user.setName("测试终级大师");
user.setAge(30);
restTemplate.put(baseurl + "/updateById/1", user);
}
@Test
public void deleteUser() {
Map<String, Object> params = new HashMap<>();
params.put("id", 1l);
ResponseEntity<String> responseEntity = restTemplate.exchange(baseurl + "/deleteById/{id}", HttpMethod.DELETE,
null, String.class, params);
System.out.println(responseEntity.getBody());
}
}