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

目录
  • springmvc接口接收参数与请求参数格式
    • 一、首先我们需要认识下http请求中的Content-Type
    • 二、注解@RequestParam(value=“id”)
    • 三、注解@RequestBody
  • springmvc接口接受前端传递参数数据类型总结
    • 一、springMVC中controller参数是自动注入
    • 二、 接受前端传递的对象
    • 三、小结一下

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

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

(0)

相关推荐

  • SpringMvc接收参数方法总结(必看篇)

    接收参数的方式: 1.HttpServletRequest方式接收 public ModelAndView test1(HttpServletRequest req){ String userName = req.getParameter("userName"); String password = req.getParameter("password"); System.out.println(userName); System.out.println(passw

  • Spring MVC请求参数接收的全面总结教程

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentResolver,此接口有众多子类,分别处理不同(注解类型)的参数,下面只列举几个子类: RequestParamMethodArgumentResolver:解析处理使用了@RequestParam注解的参数.MultipartFile类型参数和Simple类型(如long.int)参数. Reques

  • 详解SpringMVC——接收请求参数和页面传参

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name") String pass = request.getParameter("pass") } 2,Spring会自动将表单参数注入到方

  • Spring MVC传递接收参数方式小结

    目录 一.通过实体Bean接收请求参数 二.通过处理方法的形参接收请求参数 三.通过HttpServletRequest接收请求参数 四.通过@PathVariable接收URL中的请求参数 五.通过@RequestParam接收请求参数 六.通过@ModelAttribute接收请求参数 大家在开发中经常会用到Spring MVC Controller来接收请求参数,主要常用的接收方式就是通过实体对象以及形参等方式.有些用于GET请求,有些用于POST请求,有些用于两者. 下面的几种常见的后台

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

    目录 springmvc接口接收参数与请求参数格式 一.首先我们需要认识下http请求中的Content-Type 二.注解@RequestParam(value="id") 三.注解@RequestBody springmvc接口接受前端传递参数数据类型总结 一.springMVC中controller参数是自动注入 二. 接受前端传递的对象 三.小结一下 springmvc接口接收参数与请求参数格式 前言: 相信大家在刚开始接触接口定义与调用时遇到过接口接收不到请求参数的问题,本人

  • java接口返回参数按照请求参数进行排序方式

    目录 java接口返回参数按照请求参数进行排序 排序 java通过接口进行排序 描述 知识点 1.Comparable接口 2.Comparator接口 java接口返回参数按照请求参数进行排序 在项目实际开发中可能遇到过这种问题,接口请求参数顺序是[a,b,c],结果返回的数据是[bObject,cObject,aObject],导致这种原因可能是底层采用了设计模式,或者是表拼接查询,本文主要就是为了实现这种功能,采用流的方法 代码实现 import lombok.Data; import j

  • SpringMvc自动装箱及GET请求参数原理解析

    在我的概念里边,GET请求需要加上注解@RequestParam,然后它的参数类型只能是 基本数据类型 或者 基本数据类型的包装类,比如:@RequestParam String name(默认是必传的),也可以不加@RequestParam 注解,其实就相当于@RequestParam(required = false) 但是参数类型竟然是自定义对象,对象类里有不同的参数和get/set方法,而且没有使用@RequestParam 注解,那么同样也能实现GET请求 比如一个请求方法是:publ

  • 使用SpringMVC 重写、扩展HttpServletRequest请求参数

    一.背景说明 由于在项目进行前后端分离改造时,请求由多种传参方式统一定义为JSON格式传输,在改造过程中需要前后版本兼容.如果能在Controller接收参数之前将JSON格式参数进行解析成原有参数,对Request请求参数进行重写,这样能可以大大减少开发成本. 二.调研 抱着对Request请求参数目标出发,对@InitBinder和HttpServletRequestWrapper进行了研究,最终使用HttpServletRequestWrapper解决了当前问题. 1.@InitBinde

  • SpringMVC解析post请求参数详解

    目录 SpringMVC 一,概述 二.原理: 1.创建form表单 css代码 2.准备Student类 3.创建启动类 4,创建数据库,表 使用JDBC把得到的数据入库 5.创建StudentController类 6.测试 总结 SpringMVC 一,概述 作用是接受服务器请求并做出响应,是spring的后续产品,使用注解@RestController和@RequestMapping MVC设计模式: M是model模型,用来封装数据 V是view视图,用来展示数据 C是control控

  • Spring MVC请求参数与响应结果全局加密和解密详解

    前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.timestamp,long类型,时间戳. 2.data,String类型,实际的业务请求数据转化成的Json字符串再进行加密得到的密文. 3.sign,签名,生成规则算法伪代码是SHA-256(data=xxx&timestamp=11111),防篡改. 为了简单起见,加密和解密采用AES,对称秘钥

  • 使用flask如何获取post请求参数

    目录 前言 概述 1. application/json http 请求报文格式如下: 使用curl postman 请求 flask如何获取请求体呢 2. application/x-www-form-urlencoded 使用curl 请求 flask如何获取请求体呢 3. multipart/form-data http 请求报文 使用curl 请求 postman 请求 flask如何获取请求体呢 4. text/plain http 请求报文如下 使用curl 请求 postman 请

  • SpringMVC详解如何映射请求数据

    目录 1.获取参数值 1.说明 2.应用实例 3.获取http请求消息头 2.获取 javabean 形式的数据 1.使用场景说明 2.应用实例 3.使用注意事项 3.获取Servlet API 1.应用实例 2.使用注意事项 1.获取参数值 1.说明 开发中,如何获取到 http://xxx/url?参数名=参数值&参数名=参数值 这个使用的非常广泛,我们看一个案例 2.应用实例 1.创建\web\requestparam\VoteHandler.java @Controller @Reque

  • Python接口自动化之request请求封装源码分析

    目录 1. 源码分析 2. requests请求封装 3. 总结 前言: 我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好.那么,我们可以考虑将request的请求类型(如:Get.Post.Delect请求)都封装起来.这样,我们在编写用例的时候就可以直接进行请求了. 1. 源码分析 我们先来看一下Get.Post.Delect等请求的源码,看一下它们都有什么特点. (1)Get请求源码 def get(self, url, **kwargs): r""

  • 前端HTTP发POST请求携带参数与后端接口接收参数的实现

    目录 HTTP的GET请求与POST请求 常见HTTP内容类型Content-Type 后端收参方式-前端对应传参方式 application/json multipart/form-data 总结 参考 HTTP的GET请求与POST请求 HTTP请求方式有GET.POST.PUT.DELETE等八种,最常见的就是GET.POST,下面说一下GET请求,很简单. GET是按照规定参数只能写在URL里面(虽然可以有请求体但是不符合规定),没有请求体也就是data,那传就非常简单了,前端就是字符串

随机推荐