参数传递的几种方式
header
header一般传递的是跟业务无关性的信息。比如我们之前的requestId,为了将一个用户的所有请求通过一个唯一值串起来;还有就是传递一些认证信息。
获取该部分的值有2种方式。
注解的方式
@RequestHeader(name = "X-Request-Id", required = false, defaultValue = "missing") String requestId
name: 为header的key ;
required: 是否必传;
defaultValue: 默认值;
HttpServletRequest 对象中获取
String token = request.getHeader("token");
示例代码
@RequestMapping("header")
public ResMsg header(
@RequestHeader(name = "X-Request-Id", required = false, defaultValue = "missing") String requestId,
HttpServletRequest request) {
String token = request.getHeader("token");
ResMsg<Map> regMsg = new ResMsg<>();
Map<String, String> map = new HashMap();
map.put("X-Request-Id", requestId);
map.put("token", token);
regMsg.setData(map);
return regMsg;
}
请求示例:
image.png结果示例:
{
"code": 0,
"msg": "成功",
"data": {
"X-Request-Id": "201808192030000001",
"token": "f6c1999efc055cd6cdfe5f16c51e6617"
}
}
PathVariable
PathVariable即路径中的参数。这个位置传递的参数一般是一个资源的唯一性信息;
注解的方式
@PathVariable("userId") String userId
示例代码
@RequestMapping("pathVariable/user/{userId}/order/{orderNo}")
public ResMsg pathVariable(@PathVariable("userId") String userId, @PathVariable("orderNo") String orderNo) {
ResMsg<Map> regMsg = new ResMsg<>();
Map<String, String> map = new HashMap();
map.put("userId", userId);
map.put("orderNo", orderNo);
regMsg.setData(map);
return regMsg;
}
请求示例
image.png结果示例
{
"code": 0,
"msg": "成功",
"data": {
"orderNo": "201808190824001",
"userId": "0001"
}
}
Parameter
url中“?”后面的参数值。一般用于get接口。
注解的方式
@RequestParam(name = "1key") String key1
一般使用该方式。是因为参数名跟java命名规范有冲突。比如这种首字母是数字的,否者spring 默认会帮你按照参数名绑定。直接定义变量就好String key2
HttpServletRequest 对象中获取
String key3 = request.getParameter("key3");
示例代码
@RequestMapping("parameter")
public ResMsg parameter(@RequestParam(name = "1key") String key1, String key2, HttpServletRequest request) {
String key3 = request.getParameter("key3");
ResMsg<Map> regMsg = new ResMsg<>();
Map<String, String> map = new HashMap();
map.put("1key", key1);
map.put("key2", key2);
map.put("key3", key3);
regMsg.setData(map);
return regMsg;
}
请求示例
image.png返回示例
{
"code": 0,
"msg": "成功",
"data": {
"key2": "secondKey",
"key3": "thirdKey",
"1key": "firstKey"
}
}
form
form在原来网页开发中最普遍的一种数据提交方式。通过form表单提交,后来出现了ajax提交 的方式。
form有两种提交数据方式,一种是用户提交文件,一种是用于提交文本数据
multipart/form-data
指定传输数据为二进制类型,比如图片、mp3、文件。
application/x-www-form-urlencoded
默认的编码方式。一般用户提交文本数据;
注解的方式
@RequestParam(name = "1key") String key1 一般使用该方式。是因为参数名跟java命名规范有冲突。比如这种首字母是数字的,否者spring 默认会帮你按照参数名绑定。直接定义变量就好String key2
HttpServletRequest 对象中获取
String key3 = request.getParameter("key3");
示例代码
@RequestMapping(name ="form", method = {POST})
public ResMsg form(@RequestParam(name = "1key") String key1, String key2, HttpServletRequest request) {
String key3 = request.getParameter("key3");
ResMsg<Map> regMsg = new ResMsg<>();
Map<String, String> map = new HashMap();
map.put("1key", key1);
map.put("key2", key2);
map.put("key3", key3);
regMsg.setData(map);
return regMsg;
}
请求示例
image.png返回示例
{
"code": 0,
"msg": "成功",
"data": {
"key2": "secondKey",
"key3": "thirdKey",
"1key": "firstKey"
}
}
RequestParam和form方式获取数据的方式基本一致。差别是 get请求没有form 只能使用Parameter 而 post 是2种方式都能获取到数据。如果要限定接口只能post 请求使用 RequestMapping注解的method 方法; @RequestMapping(name ="form", method = {POST})
body
body也是post传递参数的一种方式。他不像是form那样的由一组key-values 而是整个body体就是一个大的字符串。由Content-Type决定body内容的格式。一般大家在用json格式
Content-Type = application/json
注解方式
@RequestBody OrderRequest orderRequest
该方式直接将json反序列化成对象。程序中直接使用。当然也可以直接使用String来接收,直接接收字符串。
HttpServletRequest 对象中获取
StringBuffer sb = new StringBuffer();
BufferedReader reader = request.getReader();
reader.lines().forEach(p -> {
sb.append(p);
});
String jsonData = sb.toString();
示例代码
@RequestMapping(value = "bodyAnnotations", method = {POST})
public ResMsg bodyAnnotations(@RequestBody OrderRequest orderRequest) {
ResMsg<OrderRequest> regMsg = new ResMsg<>();
regMsg.setData(orderRequest);
return regMsg;
}
@RequestMapping(value = "bodyStream", method = {POST})
public ResMsg bodyStream(HttpServletRequest request) {
OrderRequest orderRequest = null;
try {
StringBuffer sb = new StringBuffer();
BufferedReader reader = request.getReader();
reader.lines().forEach(p -> {
sb.append(p);
});
String jsonData = sb.toString();
Gson gson = new Gson();
orderRequest = gson.fromJson(jsonData, OrderRequest.class);
} catch (IOException e) {
e.printStackTrace();
}
ResMsg<OrderRequest> regMsg = new ResMsg<>();
regMsg.setData(orderRequest);
return regMsg;
}
请求示例
image.png返回示例
{
"code": 0,
"msg": "成功",
"data": {
"userId": "1",
"goodsId": "1",
"price": 100
}
}
Spring的默认绑定
如果你定义的方法默认是一个对象来接收参数。spring默认会将parameter和form提交过来的参数绑定到相应的属性上。
示例代码
@RequestMapping(value = "binding")
public ResMsg binding(OrderRequest orderRequest) {
ResMsg<OrderRequest> regMsg = new ResMsg<>();
regMsg.setData(orderRequest);
return regMsg;
}
get请求示例
image.png返回示例
{
"code": 0,
"msg": "成功",
"data": {
"userId": "2",
"goodsId": "2",
"price": 10
}
}
post请求示例
image.png返回示例
{
"code": 0,
"msg": "成功",
"data": {
"userId": "1",
"goodsId": "3",
"price": 1
}
}
网友评论