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等