SpringMVC Controller接受前端数据的方式

前端传递数据类型

一. x-www-form-urlencoded
是浏览器默认的编码格式

  1. 它是post的默认格式,使用js中URLencode转码方法。包括将name、value中的空格替换为加号;将非ascii字符做百分号编码;将input的name、value用‘=’连接,不同的input之间用‘&’连接。

注:百分号编码引用自文章
使用这种编码的目的是为了传输, 类似UTF8的用途.。百分号编码中分为保留字符和非保留字符, 很明显, 所谓的保留字符就是有其特殊用途的, 编码时需要转换的; 非保留字符就是可以直接被使用的, 编码时不需要转换的。汉字‘丁’吧,他的utf8编码在十六进制下是0xE4B881,占3个字节,把它转成字符串‘E4B881’,变成了六个字节,每两个字节前加上百分号前缀,得到字符串“%E4%B8%81”,变成九个ascii字符,占九个字节(十六进制下是0x244534254238253831)

  1. 使用URLencode转码,这种post格式跟get的区别在于,get把转换、拼接完的字符串用‘?’直接链接到URL后,参数转换?key=value&key=value格式,所以请求体里没有数据;而post把转换、拼接后的字符串放在了请求体里,不会在浏览器的地址栏显示,因而更安全一些

x-www-form-urlencoded格式小结
post的默认请求
需要把对象参数序列化为字符串参数
参数采用类似get的参数拼接方式
使用URIencode转码方式,转码会增加体积,适合短字节
请求参数放在请求体里
不在地址栏显示参数,安全性高
传表单内的数据时会将数据转换为键值对

二. form-data
对于一段utf8编码的字节,用application/x-www-form-urlencoded传输其中的ascii字符没有问题,但对于非ascii字符传输效率就很低了

  1. 基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。
  2. 在处理表单数据的时候,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息;

不转码,适合传输长字节(如文件)
请求参数放在请求体里
不在地址栏显示参数,安全性高
form-data格式一般是用来进行文件上传的。

multipart/form-data是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。另外,该格式会生成一个boundary字符串来分割请求头与请求体的,具体的是以一个boundary=${boundary}来进行分割,伪码如下:

Content-Type: multipart/form-data; boundary=${boundary}

–${boundary}

b o u n d a r y − − 上 面 b o u n d a r y = {boundary}-- 上面boundary= boundaryboundary={boundary}之后就是请求体内容了,请求体内容各字段之间以– b o u n d a r y 来 进 行 分 割 , 以 − − {boundary}来进行分割,以-- boundary,{boundary}–来结束请求体内容。具体可以参考下面例子:

POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data;
boundary=----WebKitFormBoundaryyb1zYhTI38xpQxBK

------WebKitFormBoundaryyb1zYhTI38xpQxBK Content-Disposition: form-data; name=“city_id”

1

------WebKitFormBoundaryyb1zYhTI38xpQxBK Content-Disposition: form-data; name=“company_id”

2
------WebKitFormBoundaryyb1zYhTI38xpQxBK Content-Disposition: form-data; name=“file”; filename=“chrome.png” Content-Type: image/png

PNG … content of chrome.png …
------WebKitFormBoundaryyb1zYhTI38xpQxBK–

三. json
JSON 语法是 JavaScript 对象表示法语法的子集。

  1. 数据在名称/值对中
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

JSON 对象在花括号中书写;对象可以包含多个名称/值对;名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。

{ “firstName”:“John” , “lastName”:“Doe” }

JSON传递数组在方括号里书写

{
“employees”: [
{ “firstName”:“John” , “lastName”:“Doe” },
{ “firstName”:“Anna” , “lastName”:“Smith” },
{ “firstName”:“Peter” , “lastName”:“Jones” }
]
}

JSON 文件
JSON 文件的文件类型是 “.json”
JSON 文本的 MIME 类型是 “application/json”

接收前端传来数据方式

如何接收前端传来数据,要根据数据类型来判断。主要的x-www-from-urlencoded 和 json 两种类型数据可以有一下几个接收方式。

1、普通方式

请求参数名和Controller层方法的参数一致,注意此时前端传回的参数要和方法命名的参数完全一样。

@RestController
public class Test{

	@CrossOrigin
    @PostMapping(value="/user/login")
    @ResponseBody
    public Result userlogin(@RequestParam(value = "username",required = false) String username,String password) {
       	....//具体方法
       }

  /**
     * 请求参数名和Controller方法的参数一致
     * produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml
     * {
     *     @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})
     *      或
     *     @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})
     *      或
     *     @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")
     * }
     * @param name 用户名
     * @param pwd 密码
     * @return
     *
     */
    @RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String addUser(String username, String password){
        ....//具体方法
    }
}

自定义请求方法内参数名和前端发送请求参数名不同时,在对应在参数中增加@RequestParam注解,如果在方法中的参数增加了该注解,说明请求的url必须带该带有该参数,否则不能执行该方法。如果在方法中的参数没有增加该注解,说明请求的url无需带有该参数,也能继续执行该方法。

@RequestParam(defaultValue=“0”)可设置默认值(仅当传入参数为空时)。
@RequestParam(value=“id”)可接受传入参数为id的值,覆盖该注解注释的字段。
@RequestParam(name=“name”,defaultValue = “李四”) String u_name 如果传入字段”name”为空,默认u_name的值为”李四”。若传入”name”不为空,默认u_name值为传入值。

2、对象方式

请求参数名和Controller方法中的对象的参数一致。 常用于传递多个参数的问题,这个时候可以把参数封装成为一个 pojo对象。不支持 Json格式数据

@RestController
public class Test{

	@CrossOrigin
    @PostMapping(value="/user/login")
    @ResponseBody
    public Result userlogin(User user) {
    //Entity里有User类 具有和前端传对应的属性
       	....//具体方法
       }

在这里插入图片描述
在这里插入图片描述

@PathVariable获取路径中的参数接收

  1. get & post 方式都支持
  2. 注意:url含有中文名称时,因为编码问题,无法进行映射,需要修改相应文件中的URIEncoding=”UTF-8”,对URL编码设置就可以解决中文问题。

在这里插入图片描述

Map方式接受参数

传递的参数特别多的时候可以使用Map进行接受。

@ResponseBody
@PostMapping("/demo")
public String test(@RequestParam Map<String,Object> map){
	for(Object object:map.entrySet()){
		System.out.println(object.toString());
	}
	return "success";
}

HttpServletRequest方式

比如前端传来username和password请求。


/**
 * 通过HttpServletRequest接收
 * @param request
 * @return
 */

@RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addUserByHttpServletRequest(HttpServletRequest request){
    String name = request.getParameter("username");
    String pwd = request.getParameter("password");
}

@RequestBody-JSON方式接收

将前端传递来json格式数据,json格式数据转化为 pojo对象接收,也可用 Map接收。实质上只是传递数据类型的不同 ,其他和 @RequestParam类似。

区别:@RequestParam 和 @RequestBody
一:都是接收前端参数 并可以绑定到对象上,比如Pojo对象和Map对象。
二:@RequestBody只能接收请求体中的数据,所以只能用在 post 请求方式中。 @RequestParam 则 get/post 都支持。

@ResponseBody
@PostMapping("/test")
public String test(@RequestBody User user){
	System.out.println(user);
	return "success";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值