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不一致,甚至不知道自己需要前端传什么样类型的数据格式等等。

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

相关文章

  • Java Calendar日历类原理及使用方法

    Java Calendar日历类原理及使用方法

    这篇文章主要介绍了Java Calendar日历类原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • maven私服搭建的实现步骤

    maven私服搭建的实现步骤

    本文主要介绍了maven私服搭建的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • SpringBoot基于Minio实现分片上传、断点续传的实现

    SpringBoot基于Minio实现分片上传、断点续传的实现

    本文主要介绍了SpringBoot基于Minio实现分片上传、断点续传的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 图解Java经典算法冒泡选择插入希尔排序的原理与实现

    图解Java经典算法冒泡选择插入希尔排序的原理与实现

    冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序
    2022-09-09
  • java.text.DecimalFormat用法详解

    java.text.DecimalFormat用法详解

    这篇文章主要为大家详细介绍了java.text.DecimalFormat用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 使用位运算、值交换等方式反转java字符串的多种方法(四种方法)

    使用位运算、值交换等方式反转java字符串的多种方法(四种方法)

    这篇文章主要介绍了使用位运算、值交换等方式反转java字符串,本文通过四种方式给大家讲解,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java的HashMap源码解析

    Java的HashMap源码解析

    这篇文章主要介绍了Java的HashMap源码解析,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对是一个Node,后台是用一个Node数组来存放数据,这个Node数组就是HashMap的主干,需要的朋友可以参考下
    2023-11-11
  • 使用MyBatis拦截器实现sql查询权限动态修改代码实例

    使用MyBatis拦截器实现sql查询权限动态修改代码实例

    这篇文章主要介绍了使用MyBatis拦截器实现sql查询权限动态修改代码实例,为了不耦合,现在的方案是在需要鉴权的Mybatis Mapper方法上增加一个注解,在运行过程中判断该注解存在即对sql进行修改,需要的朋友可以参考下
    2023-08-08
  • spring关于组件的注入及获取流程场景分析

    spring关于组件的注入及获取流程场景分析

    这篇文章主要介绍了spring关于组件的注入及获取流程场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • Java使用线程池批量处理数据操作具体流程

    Java使用线程池批量处理数据操作具体流程

    这篇文章主要给大家介绍了关于Java使用线程池批量处理数据操作的相关资料,Java多线程编程中线程池是一个非常重要的概念,线程池可以提高线程的复用率和任务调度的效率,尤其是当需要查询大批量数据时,需要的朋友可以参考下
    2023-06-06

最新评论