[springboot] Restful风格API请求与响应简单示例

接口映射注解:

  • @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());
	}
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值