/**
* 数据类型有六种:
* 字符串、数值、布尔值、null、对象、数组
*
* 1、字符串(使用\转义)
* {
* "name1":"xch",
* "name2":"\"xch\""
* }
*
* 2、数值(正负小数,可以使用科学计数)
* {
* "number1":100,
* "number2":-100,
* "number3":99.99,
* "number4":1e2,
* "number5":-1E2
* }
*
* 3、布尔值
* {
* "flag1":true,
* "flag2":false
* }
*
* 4、null
* {
* "flag":null
* }
*
* 5、对象(通过.访问对象属性)
* {
* "object1":{
* "name":"xch",
* "age":21
* },
* "object2":{
* "name":"ypy",
* "age":20
* }
* }
*
* 6、数组(通过[0,n-1]访问数组元素)
* {
* "arr1":[1,2,3,4,5],
* "arr2":["a","b","c","d","e"],
* "arr3":[true,null,false],
* "arr4":[{"name":"a","age":1},{"name":"b","age":2},{"name":"c","age":3}]
* }
*
* JSON用法说明
* 1、可以无限嵌套
* 2、通过键名匹配获取值
* 3、数组中可以放多个类型数据
* 如:java中(Object[] objs={"errw", 434, -4.32, null, {name="xch", user02=null}, false, true})
* {
* "objs":["errw",434,-4.32,null,{"name":"xch","user02":null},false,true]
* }
* 其中,该JSON数组中读取的对象为Object[],转为Map键值对形式使用
* 通过((Map<?, ?>) objs[4]).get("name")取值
* 4、在输入参数只有一个对象时,直接用{}封装属性字段赋值即可
* 5、并行字段用,分隔
*/
/**
* Web总结:
*
* 两种请求:
* -GET:GET服务端可以使用GET和POST请求均可,参数仅能在URL中传入
* -POST:POST服务端仅可以使用POST请求,参数可以在URL和Body均可传入
* (通常使用POST请求,GET请求一般用于从服务端获取数据,POST请求一般用于向服务端发送数据)
*
* 传参方式:
* -URL:在URL中的参数
* -Body:封装在HTTP-Body中的参数
* -form-data:用于传键值或附件(一个或多个)
* -x-www-form-urlencoded:用于传键值
* -binary:用于仅传一个附件
* -raw:原生文本
* -Text:纯文本
* -JSON:JSON解析文本
* -XML:XML解析文本
* -HTML:HTML解析文本
* -JavaScript:JS解析文本
* (八大基本数据类型及其引用类型可以通过在GET/POST请求的URL传入,其它对象只能通过JSON形式解析传入)
* (JSON对象只能通过POST请求的Body传入,也可以通过JSON字符串在GET/POST请求的URL传入,手动转Map解析)
*
* 传输效果:
* -非JSON(键值)传值
* -JSON传值
* 共性:1、单值解析,前后空格会传入
* 2、数组和集合传值效果(格式、解析)一样
* 3、数组/集合解析规则,按,分割
* 4、数组/集合解析换行符不影响,每项值前后空格会消除
* 异性:5、JSON解析数组/集合、对象时,值需加""
* 6、JSON解析对象时,需加""引用属性名,进行键值:匹配
* 7、JSON默认解析工具为SpringBoot内置的jackson依赖(单双引号解析不通用)
* 8、JSON解析内置("属性型")对象时,需加""引用属性对象名,进行键值:匹配
* (因为解析对象时,属性间相同类型可能有多个,必须匹配属性名,对象、数组/集合不例外)
*
* 作为请求的参数对象:
* 1、属性需为public或者有Get/Set方法
* 2、属性须使用引用数据类型(如:Boolean),因为基本数据类型容易失参
*/
package com.xch.test05;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* 前后端传值测试
*
* @author Chenghe Xu
* @date 2022/12/12 11:28
*/
@RestController
public class ControllerTest02 {
/**
* 非JSON(键值)传值测试
*
* 传值方式:
* -GET/POST的URL
* -POST的form-data/x-www-form-urlencoded
*
* -String
* -成功:val
* -成功: val
*
* -数组/集合
* -成功:val1,
* val2,
* val3
* -成功:val1, val2 ,val3
*
* 结论:
* 1、单值解析,前后空格会传入
* 2、数组和集合传值效果(格式、解析)一样
* 3、数组/集合解析规则,按,分割
* 4、数组/集合解析换行符不影响,每项值前后空格会消除
*/
@RequestMapping("/test1")
// public void test1(String str, String[] strs, @RequestParam("strList") List<String> strList) {
public void test1(String str, String[] strs, @RequestParam("strSet") Set<String> strSet) {
System.out.println(str);
System.out.println(Arrays.toString(strs) + "--" + strs.length);
// System.out.println(strList + "--" + strList.size());
System.out.println(strSet + "--" + strSet.size());
}
/**
* JSON传值测试(后端需使用@RequestBody声明变量,每次只能传一个JSON对象或变量)
*
* 传值方式:
* -POST的raw选择JSON解析格式
*
* -String
* -成功:val
* -成功: val
*
* -数组/集合
* -成功:[
* "val1",
* "val2",
* "val3"
* ]
* -成功:["val1" , "val2" , "val3"]
*
* -对象
* -成功:{
* "name": "小徐",
* "age": 21
* }
*
* -数组/集合
* -成功:[
* {
* "name": "小徐",
* "age": 21
* },
* {
* "name": "小杨",
* "age": 22
* }
* ]
*
* 结论:
* 5、JSON解析数组/集合、对象时,值需加""
* 6、JSON解析对象时,需加""引用属性名,进行键值:匹配
* 7、JSON默认解析工具为SpringBoot内置的jackson依赖(单双引号解析不通用)
*/
@RequestMapping("/test2")
// public void test2(@RequestBody String str) {
// public void test2(@RequestBody String[] strs) {
// public void test2(@RequestBody List<String> strList) {
// public void test2(@RequestBody Set<String> strSet) {
// public void test2(@RequestBody Obj obj) {
// public void test2(@RequestBody Obj[] objs) {
// public void test2(@RequestBody List<Obj> objList) {
public void test2(@RequestBody Set<Obj> objSet) {
// System.out.println(str);
// System.out.println(Arrays.toString(strs) + "--" + strs.length);
// System.out.println(strList + "--" + strList.size());
// System.out.println(strSet + "--" + strSet.size());
// System.out.println(Arrays.toString(objs) + "--" + objs.length);
// System.out.println(objList + "--" + objList.size());
System.out.println(objSet + "--" + objSet.size());
}
/**
* JSON传值测试-内嵌("属性型")对象
*
* 传值方式:
* -POST的raw选择JSON解析格式
*
* -对象-内嵌("属性型")对象
* -成功:{
* "obj":{
* "name": "小杨",
* "age": 22
* }
* }
* -对象-内嵌("属性型")数组/集合
* -成功:{
* "objs":[
* {
* "name": "小徐",
* "age": 21
* },
* {
* "name": "小杨",
* "age": 22
* }
* ],
* "objList":[
* {
* "name": "小佩",
* "age": 23
* },
* {
* "name": "小莹",
* "age": 24
* }
* ]
* }
*
* 结论:
* 8、JSON解析内置("属性型")对象时,需加""引用属性对象名,进行键值:匹配
* (因为解析对象时,属性间相同类型可能有多个,必须匹配属性名,对象、数组/集合不例外)
*/
@RequestMapping("/test3")
public void test3(@RequestBody InlayObj inlayObj){
System.out.println(inlayObj);
}
}
/**
* 接收前端参数的对象属性
* -要么是public修饰
* -要么有get/set方法
*
* @author Chenghe Xu
* @date 2022/12/12 14:59
*/
@Data
class Obj {
private String name;
private Integer age;
}
@Data
class InlayObj {
private String name;
private Integer age;
//内嵌对象
private Obj obj;
// private Obj[] objs;
private List<Obj> objList;
}