美文网首页程序员
第二章 参数传递

第二章 参数传递

作者: 一家之主小书童 | 来源:发表于2018-03-20 20:24 被阅读0次

参数传递的几种方式

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
    }
}

相关文章

网友评论

    本文标题:第二章 参数传递

    本文链接:https://www.haomeiwen.com/subject/eolpqftx.html