版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28379809/article/details/81395495
在web应用中,经常需要处理HTTP请求,请求通常会携带指定格式的数据,包括普通格式的数据,如表单、AJAX默认格式的数据,也有json这样更复杂的数据格式。对于不同类型的数据,有着不同的接收方式。
本文主要介绍普通类型(表单域对象、AJAX默认格式数据)的接收方式,以及json数据的接收方式。
普通数据的接收方式(默认)
这里说的普通数据主要指如下类型:表单提交、get形式的链接请求、非json格式的AJAX请求。
<!-- 表单 -->
<form method="POST" action="/login">
姓名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<button type="submit">提交</button>
</form>
<!-- url形式 -->
<button click="submit('myName','234')">提交</button>
<script>
function submit(name, pass){
window.location.href = "/login?username="+name+"&password="+pass;
}
</script>
<!-- ajax形式 -->
var myData = {"username":"myName", "password":"123"}; //非json
$().ajax({
url: "/login",
method: "POST",
async:true,
data: myData,
dataType: "json", //返回数据的格式,而不是data的格式
success:function(data){
//...
}
});
对于普通形式的数据,介绍两种接收方式:
1.利用spring的反射机制,直接映射到参数
@RestController
public Class UserController{
@PostMapping(value = "/login")
public Map login(String username, String password){
Map<String, Object> map = new HashMap<>();
if (username!=null && password!=null){
User user = new User(username, password);
//...
} else {
map.put("success", false);
map.put("msg", "参数错误");
}
return map;
}
}
2.使用HTTPServletRequest
@RestController
public Class UserController{
@PostMapping(value = "/login")
public Map login(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
Map<String, Object> map = new HashMap<>();
if (username!=null && password!=null){
User user = new User(username, password);
//...
} else {
map.put("success", false);
map.put("msg", "参数错误");
}
return map;
}
}
json格式数据的接收
ajax请求指定content-type为application/json这样的形式。使用HTTPServletRequest是无法接受到数据的,必须使用@ResponseBody注解。
@RestController
public Class UserController{
@PostMapping(value = "/login")
public Map login(@ResponseBody User user){
Map<String, Object> map = new HashMap<>();
if (user.getUsername()!=null && user.getPassword()!=null){
//...
} else {
map.put("success", false);
map.put("msg", "参数错误");
}
return map;
}
}
class User{
private String username;
private String password;
//省略get和set
}
对于上面的@ResponseBody注解,需要注意的事,我们将请求的body中携带的数据全部给了这个注解后的参数。也就是说,一个方法只会有一个@ResponseBody。
问题出现了,如果我要接收的是一个复杂的数据怎么办,比如不仅有username,password,还有List<Skills> skillList
这样包含了Skill对象的的List数据。解决办法很简单,直接将这个list也作为一个参数封装到User类中,又或者重新定义一个XXXForm类来包含所有的数据。
public class UserSaveForm{
private User user;
private List<Skill> skillList;
//省略get和set
}
@RestController
public Class UserController{
@PostMapping(value = "/login")
public Map login(@ResponseBody UserSaveForm userSaveForm){
Map<String, Object> map = new HashMap<>();
if (userSaveForm.getUser()!=null && userSaveForm.getSkillList()!=null){
//...
} else {
map.put("success", false);
map.put("msg", "参数错误");
}
return map;
}
}