springboot2 启动传参_springboot2基础运用之参数绑定, 正确理解Content-type的作用范围...

Content-Type的理解

http协议是建立在tcp/ip协议之上的应用层协议,主要包括三个部分,状态行,头部信息,消息主体。对应一个http请求就是:请求行,请求头,请求体。

content-type就在请求头中 . 一般服务端会根据content-type字段来获取参数是怎么编码的,然后对应去解码;

表单提交或上传文件的常用的资源类型:

application/x-www-form-urlencoded (默认)

multipart/form-data,

application/json,

application/xml

form表单中可以定义enctype属性,该属性的含义是在发送到服务器之前应该如何对表单数据进行编码。

默认的情况下,表单数据会编码为 "application/x-www-form-unlencoded".

enctype常用的属性值如下:application/x-www-form-unlencoded: 在发送前编码所有字符(默认情况下);

multipart/form-data, 不对字符编码。在使用文件上传时候,使用该值。

请求体中嵌套数组的话,或复杂的格式的话,建议使用application/json传递比较好,后端解析会方便很多, 通过json的形式将数据发送给服务器。

json的形式的优点是它可以传递结构复杂的数据形式

参数绑定

参数传递可以说是服务端和外界沟通的主要方式,这节是非常重要的!

通过url传参

|---get方式Url传参

|---@PathVariable 即:url/id/1994 形式

|---@RequestParam 即:url?username=zed形式

|---POST方式传参

|---@RequestParam

|---请求体中加入文本

配置文件传参

get方式Url传参:

@PathVariable

@RestController

public class HelloController {

@GetMapping("/hello/{name}")

public String hello(@PathVariable("name") String name){

// 形参的name可以随意

System.out.println("获取到的name是:"+name);

return "hello "+name;

}

}

get方式Url传参:

@RequestParam

如果请求参数的名字跟方法中的形参名字一致可以省略@RequestParam("name")

@GetMapping("/hello")

public String hello(@RequestParam("name") String name){

System.out.println("获取到的name是:"+name);

return "hello "+name;

}

3.get方式Url传参:

@RequestParam+默认参数

@GetMapping("/hello")

public String hello(@RequestParam(value = "name",defaultValue = "admin") String name){

System.out.println("获取到的name是:"+name);

return "hello "+name;

}

注意:如果没有指定默认值,并且没有传递参数将会报错

Required String parameter 'name' is not present :name参数没有提供

解决方案

1.defaultValue = "xxx" :使用默认值

2.required = false :标注参数是非必须的

@GetMapping("/hello")

public String hello(@RequestParam(value = "name",required = false) String name){

System.out.println("获取到的name是:"+name);

return "hello "+name;

}

POST方式传递数据

@RestController

public class HelloController {

public static Logger log = LoggerFactory.getLogger(HelloController.class);

@PostMapping("/user")

public String add(@RequestParam("name") String name,@RequestParam("age") Integer age){

log.info(name+" "+age);

return "name:"+name+"\nage:"+age;

}

}

POST传递字符串文本

@PostMapping("/PostString")

public String postString(HttpServletRequest request) {

ServletInputStream is = null;

try {

is = request.getInputStream();

StringBuilder sb = new StringBuilder();

byte[] buf = new byte[1024];

int len = 0;

while ((len = is.read(buf)) != -1) {

sb.append(new String(buf, 0, len));

}

System.out.println(sb.toString());

return sb.toString();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (is != null) {

is.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return null;

}

@requestbody接收参数

@PostMapping("/save")

@ResponseBody

public Map save(@RequestBody User user){

Map map = new HashMap ();

map.put("user",user);

return map;

}

@PostMapping("/user")

public String user(@RequestBody User user){

log.info(user.toString());

return null;

}

案例

package top.qsou.test.demo.controller;

import org.springframework.web.bind.annotation.*;

import top.qsou.test.demo.dto.User;

import java.awt.print.Pageable;

@RestController

@RequestMapping("/param")

public class ParamController {

/**

* url 直传, 可获取到值 ; @RequestParam 可有可无

* @param name

* @param pass

* @return

*/

@GetMapping("test1")

public Object test01(@RequestParam String name, @RequestParam String pass) {

System.out.println( name + pass );

return name + "---------" + pass;

}

/**

* defaultValue 有效, 存在默认值

* @param name

* @param pass

* @return

*/

@GetMapping("test1-1")

public Object test02(@RequestParam(defaultValue = "wxw") String name,String pass) {

System.out.println( name + pass );

return name + "---------" + pass;

}

/**

* form-data 提交时: 可获取

* x-www-urlencoded 提交时: 可获取

* raw json体格式提交时:无法获取, 必须使用@RequestBody注解获取

* @param user

* @return

*/

@PostMapping("test2")

public Object test04(User user) {

return user.getName() + "---------" + user.getPass();

}

/**

* 必须是json体格式接收

* @param user

* @return

*/

@PostMapping("test2-1")

public Object test05(@RequestBody User user) {

return user.getName() + "---------" + user.getPass();

}

/**

* form-data 提交时: 可获取

* x-www-urlencoded 提交时: 可获取

* raw json体格式提交时:无法获取

* @param name

* @param pass

* @return

*/

@PostMapping("test2-3")

public Object test042(@RequestParam String name,String pass) {

return name+ "-----------------"+pass;

}

}

重点: 划线

multipart/form-data与x-www-form-urlencoded区别

multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;

x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。比如,name=java&age=23;特殊字符需要转义成utf-8编号,如空格会变成 %20

raw

可以上传任意格式的文本,可以上传text、json、xml、html等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值