springmvc接口接收参数与请求参数格式的整理

 更新时间:2021年11月15日 11:29:30   作者:滴丶学生卡  
这篇文章主要介绍了springmvc接口接收参数与请求参数格式的整理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springmvc接口接收参数与请求参数格式

前言: 相信大家在刚开始接触接口定义与调用时遇到过接口接收不到请求参数的问题,本人也一样,使用springmvc去定义接口或调用第三方http接口时或多或少会搞混;下面咱们一起来整理下接口定义和请求参数格式的关系。

一、首先我们需要认识下http请求中的Content-Type

我们常用的有以下几种:

1、application/x-www-form-urlencoded; charset=UTF-8,浏览器的原生 form 表单,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和value都进行了URL转码。

2、multipart/form-data:使用表单上传文件时,必须设置 form 的 enctyped 属性。

3、application/json; charset=utf-8,请求参数是序列化后的json格式字符串,方便提交复杂结构的数据,特别适合RESTful 的接口。

二、注解@RequestParam(value=“id”)

1、常用来处理地址栏传参和表单提交的参数绑定,Content-Type为application/x-www-form-urlencoded编码的内容,提交方式GET、POST

2、如果用java发送http请求,需采用key、value传参方式发送数据,如下写法:

    public static String post(HttpClient httpClient, String url, Map<String, String> params,
            Map<String, String> headers) throws ClientProtocolException, IOException {
        logger.info("Ready Post Request Url[{}]", url);
        HttpPost post = new HttpPost(url);
        setHttpHeaders(post, headers);
        List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            nameValuePairList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
        }
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8);
        post.setEntity(entity);
        HttpResponse response = httpClient.execute(post);
        if (null == response || response.getStatusLine() == null) {
            logger.info("Post Request For Url[{}] is not ok. Response is null", url);
            return null;
        } else if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            logger.info("Post Request For Url[{}] is not ok. Response Status Code is {}", url,
                    response.getStatusLine().getStatusCode());
            return null;
        }
        return EntityUtils.toString(response.getEntity());
    }

三、注解@RequestBody

1、一般用来接收json格式数据,后端直接定义好请求参数的bean,Content-Type为application/json; charset=utf-8,使用示例:

@RequestBody User user

请求参数:

{
    "id": 1,
    "userName": "bryant",
    "password": "123456",
    "name": "kobe",
    "Date": "1990-02-27"
}

2、使用java发送请求代码示例:

    public static String post(HttpClient httpClient, String url, String content, Map<String, String> headers)
            throws ClientProtocolException, IOException {
        logger.info("Ready Post Request Url[{}]", url);
        url = url.replaceAll(" ", "%20");
        HttpPost post = new HttpPost(url);
        setHttpHeaders(post, headers);
        StringEntity entity = new StringEntity(content, Constants.CHARSET_UTF8);
        post.setEntity(entity);
        HttpResponse response = httpClient.execute(post);
        if (null == response || response.getStatusLine() == null) {
            logger.info("Post Request For Url[{}] is not ok. Response is null", url);
            return null;
        } else if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            logger.info("Post Request For Url[{}] is not ok. Response Status Code is {}", url,
                    response.getStatusLine().getStatusCode());
            return null;
        }
        return EntityUtils.toString(response.getEntity(), "utf-8");
    }
    public static void main(String[] args) throws IOException {
        Map<String, Object> map = new HashMap<>();
        map.put("empId", "1");
        map.put("empName", "测试用户");
        map.put("empEmail", "test@qq.com");
        Map<String, String> head = new HashMap<>();
        // 一定要设置参数格式
        head.put("Content-Type", "application/json;charset=UTF-8");
        System.out.println(HttpCaller.post(HttpClients.createDefault(), "http://localhost:8080/user/add",
                JsonUtil.toJson(map), head));
    }

3、如果使用postman调试接口,需要设置传参方式为raw-JSON,如下图:

在这里插入图片描述

springmvc接口接受前端传递参数数据类型总结

一、springMVC中controller参数是自动注入

在springMVC中,controller中方法的参数是自动注入的,在使用注解的方式下,通常有:

  • @RequestParam:取querystring当中的参数
  • @PathVariable:取 在@RequestMapping中定义的占位符中的参数(/test/{id})
  • @RequestBody:取request 这个消息体 (可以组装json对象)

在不使用注解的情况下,默认有一些对象可以自动注入如:

  • HttpServletRequest
  • HttpServletResponse
  • MultipartFile
  • MultipartRequest

除此之外不使用注解的情况下,也可以接受前台传入的querystring中的参数。

二、 接受前端传递的对象

1、从querystring中的参数中获取

@RequestParam:接受对象类型(Integer、String、Boolean等基本数据类型),不能接收自定义类型。

不带注解:接受基本数据类型,若接收类型为自定义类型,会组装参数中与自定义类型属性名和类型相符的参数。

这种方式总结:

(1).获取自定义类型的对象时,不使用注解即可以获取

(2).在组装对象时可以使用以被获取过的参数

注意:$.ajax contenType是appliation/json的时候,在后台用spring mvc的@Requestparam注解接收参数,始终接收不到。因为@RequestParam 底层是通过request.getParameter方式获得参数的,也就是说,@RequestParam 和 request.getParameter是同一回事。

所以@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容(及表单内容数据),提交方式GET、POST。

2、从请求体(body)中获取(及获取对象数据)

当请求体中是一段json数据时,@RequestBody会解析该json字符串并将其注入指定的自定义类型中。

通过@RequestBody的方式可以接收以json数据传输的对象,但前提是请求的Content-Type必须为application/json,并且引入了jackson-databind包

注意:

1.@RequestBody该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

2.@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。

3.不使用@RequestBody注解时,可以接收Content-Type为application/x-www-form-urlencoded类型的请求所提交的数据,数据格式:aaa=111b b b = 222 。 f o r m 表 单 提 交 以 及 j Q u e r y 的 bbb=222。form表单提交以及jQuery的bbb=222。form表单提交以及jQuery的.post()方法所发送的请求就是这种类型。例如后台接口接收数据的对象前不加@RequestBody修饰。

3、接收前端传递的数组

接收数组可以使用注解方式的@RequestParam、@RequestBody或者无注解的方式,也可以同时使用他们三个

在接受数组时,默认按照方法的参数名来映射请求的参数,目前很多前端框架喜欢传递数组时在请求参数后面加上"[]",所以使用@RequestParam时可以规定value使之对应如@RequestParam(“ids[]”) Integer[] ids。

三、小结一下

由上可知道,后台需要处理什么数据,或者需要前台需要传递什么类型的数据时,我们既可以根据这些特性来判断,而不会导致有时contentType不一致,甚至不知道自己需要前端传什么样类型的数据格式等等。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈SpringBoot优化技巧

    浅谈SpringBoot优化技巧

    这篇文章主要介绍了浅谈SpringBoot优化技巧,需要的朋友可以参考下。
    2017-09-09
  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    Spring Boot中自定义注解结合AOP实现主备库切换问题

    这篇文章主要介绍了Spring Boot中自定义注解+AOP实现主备库切换的相关知识,本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需要的朋友可以参考下
    2019-08-08
  • 关于Java中Bean的生命周期详解

    关于Java中Bean的生命周期详解

    这篇文章主要介绍了关于Java中Bean的生命周期详解,所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期,需要的朋友可以参考下
    2023-08-08
  • Spring的Bean生命周期之BeanDefinition详解

    Spring的Bean生命周期之BeanDefinition详解

    这篇文章主要介绍了Spring的Bean生命周期之BeanDefinition详解,在spring bean创建过程 依赖 BeanDefinition 中的信息处理bean的生产,BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口,需要的朋友可以参考下
    2023-12-12
  • SpringIOC容器Bean的作用域及生命周期实例

    SpringIOC容器Bean的作用域及生命周期实例

    这篇文章主要为大家介绍了SpringIOC容器Bean的作用域及生命周期实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Spring拦截器和过滤器的区别在哪?

    Spring拦截器和过滤器的区别在哪?

    相信很多小伙伴都对Spring拦截器和过滤器的区别有疑惑,今天特地整理了本篇文章,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • Java中类的定义与实例化详解

    Java中类的定义与实例化详解

    这篇文章主要给大家介绍了关于Java中类的定义与实例化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 关于feign对x-www-form-urlencode类型的encode和decode问题

    关于feign对x-www-form-urlencode类型的encode和decode问题

    这篇文章主要介绍了关于feign对x-www-form-urlencode类型的encode和decode问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java排序算法之直接插入、快排和希尔排序详解

    Java排序算法之直接插入、快排和希尔排序详解

    这篇文章主要给大家介绍了Java排序算法中的直接插入、快排和希尔排序,文中有详细的图文解释和代码示例,对我们学习Java算法有一定的帮助,感兴趣的同学可以参考阅读下
    2023-07-07
  • mybatisplus实现自动创建/更新时间的项目实践

    mybatisplus实现自动创建/更新时间的项目实践

    Mybatis-Plus提供了自动填充功能,可以通过实现MetaObjectHandler接口来实现自动更新时间的功能,本文就来介绍一下mybatisplus实现自动创建/更新时间的项目实践,感兴趣的可以了解下
    2024-01-01

最新评论