实际项目中,大多数项目,前后端是分离的。 前端发HTTP请求到后端Server
,然后后端接收参数做相应业务逻辑。
❝
首先先说下请求类型:
❞
GET GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
HEAD HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
POST POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT PUT方法用请求有效载荷替换目标资源的所有当前表示。
DELETE DELETE方法删除指定的资源。
CONNECT CONNECT方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS OPTIONS方法用于描述目标资源的通信选项。
TRACE TRACE方法沿着到目标资源的路径执行一个消息环回测试。
PATCH PATCH方法用于对资源应用部分修改。
实际上常用的类型也就是 GET和POST,GET是从服务器获取资源,POST是提交资料到服务器
;
不过很多开发的同学,都不区分两者的区别,最好还是区分一下,两者毕竟有所不同;
那么HTTP 请求都有什么类型的参数呢?
大多有这三类请求参数类型:
@PathVariable
: http://localhost:9002/test/user/{userId}
@RequestParam
: http://localhost:9002/test/get?name=11&age=22
@RequestBody
: 参数可能是Object, 也可能是List
我们这里不使用前端的任何框架,以纯JS的形式,去封装一个HTTP方法,发送HTTP请求
;
❝
src/main/resources/templates/js/test.js
❞
//封装HTTP请求方法 const http = { // 请求方法 request: (params = {}) => { // 默认参数和参数合并 const requestParams = Object.assign({ type: 'GET', url: '', dateType: 'json',//请求返回结果类型 data: { // 请求参数 }, headers: { // 请求头 }, callback0: () => { // 报文成功返回后回调 } }, params); // 请求 const xhr = new XMLHttpRequest(); // 请求方法 const {type, data, url, headers} = requestParams; const requestMethod = ('' + type).toLocaleLowerCase(); // url 是否携带参数 const urlHasParams = requestMethod === 'get'; const requestUrl = urlHasParams ? http.getUrlString(url, data) : url; // 参数类型 const dataType = Object.prototype.toString.apply(data); xhr.open(type, requestUrl); if (dataType === '[object Array]') { xhr.setRequestHeader("Content-type", "application/json; charset=utf-8"); } // 自定义表头 Object.keys(headers).forEach(m => { xhr.setRequestHeader(m, headers[m]); }); xhr.addEventListener("load", e => { const status = xhr.status; if (status === 200) { requestParams.callback0(xhr.response); } else { console.log(e); } }); xhr.send(urlHasParams ? null : http.getFormData(data)); }, // Object 转化为 String getQueryString: (data = {}) => { let _r = []; Object.keys(data).forEach(m => { _r.push(`${m}=${JSON.stringify(data[m])}`); }); _r = _r.join('&'); return _r; }, // GET 请求,参数合并到URL上 getUrlString: (url, data) => { return url.includes('?') ? url + '&' + http.getQueryString(data) : url + '?' + http.getQueryString(data); }, // formData getFormData: data => { const dataType = Object.prototype.toString.apply(data); // Object if (dataType === '[object Object]') { const formData = new FormData(); Object.keys(data).forEach(m => { formData.append(m, data[m]); }); return formData; } else { // Array return JSON.stringify(data); } } }; 复制代码
❝
com.scaffold.test.controller.TestController
❞
// 路径 @GetMapping("/path/{id}") public Object testId(@PathVariable String id, @RequestParam String name) { Map<String, Object> map = new HashMap<>(); map.put("id", id); map.put("name", name); return map; } 复制代码
@PathVariable
去接收路径参数;
❝
html
❞
<!--GET: 路径中携带参数--> <h1>test GET: 路径中携带参数</h1> <code>http://localhost:9002/test/path/6666?name=11</code> <br> <code> GET { name: '11' } </code> <br/> <br/> <button onclick="testPath()">点击测试</button> <h2>testPath 结果</h2> <code class="testPathResult"></code> 复制代码
❝
js
❞
// Get 参数存在于路径中 const testPath = () => { http.request({ url: '/test/path/6666', type: 'get', data: { name: '111', }, callback0: data => { document.querySelector('.testPathResult').innerHTML = data; } }) }; 复制代码
结果
❞ GET请求,参数都会附加到URL上
,如: http://localhost:9002/test/get?name=11&age=22
@GetMapping("/get") public Object testGet(@RequestParam String name, @RequestParam int age) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", name); result.put("age", age); return result; } 复制代码
❝
html
❞
<!--GET: 单个参数--> <h1>test GET传参: 单个参数</h1> <code>http://localhost:9002/test/get?name=11&age=22</code> <br> <code> GET { name: 'get', age: 22 } </code> <br/> <br/> <button onclick="test1()">点击测试</button> <h2>test1 结果</h2> <code class="test1Result"></code> <br> 复制代码
❝
js
❞
// GET 参数类型为 Object const test1 = () => { http.request({ url: '/test/get', type: 'get', data: { name: 'get', age: 22 }, callback0: data => { document.querySelector('.test1Result').innerHTML = data; } }) }; 复制代码
结果
❞ 有时候前端需要传多个ID,如 productId=1,2,3
// 数组接收 @GetMapping("/getList") public Object testGet4(@RequestParam String[] productId) { ArrayList<Object> list = new ArrayList<>(); for (String id : productId) { // 数据处理 list.add(id); } return list; } 复制代码
❝
html
❞
<!--GET: 参数数组--> <h1>test GET传参: 数组</h1> <code>http://localhost:9002/test/getList?productId=1,2,3</code> <br> <code> GET { productId: 1,2,3 } </code> <br/> <br/> <button onclick="test4()">点击测试</button> <h2>test4 结果</h2> <code class="test4Result"></code> <br> 复制代码
❝
js
❞
// GET 获取数组ID const test4 = () => { http.request({ url: '/test/getList', type: 'get', data: { productId: '1,2,3' }, callback0: data => { document.querySelector('.test4Result').innerHTML = data; } }) }; 复制代码
结果
❞POST请求和GET请求不同,POST请求一般是是在response body里面的;
❝
POST请求参数处理:
❞
// formData getFormData: data => { const dataType = Object.prototype.toString.apply(data); // Object if (dataType === '[object Object]') { const formData = new FormData(); Object.keys(data).forEach(m => { formData.append(m, data[m]); }); return formData; } else { // Array return JSON.stringify(data); } } 复制代码
如果参数是Object, 用FromData的格式进行传参
,用 @RequestParam
接收;
如果参数是Object, 序列化数据直接进行传参(需指定Content-type:application/json; charset=utf-8)
;
❝
这里我们先说,POST单个接收参数,也就是POST的参数是Object, 一个个接收;
❞
// 单个参数接收 @PostMapping("/post") public Object testPost(@RequestParam String name, @RequestParam int age) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", name); result.put("age", age); return result; } 复制代码
❝
注意:
当前接收方式,前端必须是FromData格式进行传参;
当前Content-type是 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNB8kMuHgB1nEVjBz
❞
单个接收参数,在参数过多时,不适合这种写法;
❝
这时,我们可以用实体类接收:
❞
// 实体类接收:不加注解 @PostMapping("/post22") public Object testPost22(Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } 复制代码
我们可以用 不加注解的方式用实体类接收
,这时候一定不能加注解 @RequestBody
;
❝
实体类Test
❞
public class Test implements Serializable { private static final long serialVersionUID=1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private String name; private String age; } 复制代码
FromData参数形式Content-type是multipart/form-data;而 @RequestBody,一般是接收Content-type是application/json的参数,如果你在这里使用了@RequestBody,一定会报一下错误
:
{"code":400,"message":"Content type 'multipart/form-data;boundary=----WebKitFormBoundarymrp2iCvqhwa3oMaR;charset=UTF-8' not supported"} 复制代码
如果我们一定要使用 @RequestBody
接收参数,一定要记得设置Content-Type为application/json;
// @RequestBody 实体类接收 @PostMapping("/post23") public Object testPost2(@RequestBody Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } 复制代码
所以,
为了方便测试,我们对HTTP请求方法做出了以下更改:
// formData getFormData: data => { const dataType = Object.prototype.toString.apply(data); // Object // isFromData标注是否使用FromData方式发送参数 if (dataType === '[object Object]' && data.isFromData) { const formData = new FormData(); Object.keys(data).forEach(m => { formData.append(m, data[m]); }); return formData; } else { // Array || Object(JSON格式传参) return JSON.stringify(data); } } // @ResponseBody注解,接收参数时,必须是application/json // POST请求不以FromData格式时 if (dataType === '[object Array]' || (requestMethod == 'post' && !data.isFromData)) { xhr.setRequestHeader("Content-type", "application/json; charset=utf-8"); } 复制代码
❝
同时测试三种方法接受参数:
❞
// @RequestParam 单个参数接收------前端使用FromData @PostMapping("/post") public Object testPost(@RequestParam String name, @RequestParam int age) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", name); result.put("age", age); return result; } // 实体类接收:不加注解------前端使用FromData @PostMapping("/post22") public Object testPost22(Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } // @RequestBody 实体类接收------前端不使用FromData @PostMapping("/post23") public Object testPost2(@RequestBody Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } 复制代码
❝
html
❞
<!--POST:单个参数,FromData格式--> <h1>test POST:单个参数,FromData格式</h1> <code> POST { name: 'post', age: 22 } </code> <br/> <br/> <button onclick="test2()">点击测试</button> <h2>test2 结果</h2> <code class="test2Result"></code> <br> <hr><!--POST:单个参数,以JSON格式发送--> <h1>test POST:单个参数,以JSON格式发送</h1> <code> POST { name: 'post', age: 23 } </code> <br/> <br/> <button onclick="test23()">点击测试</button> <h2>test23 结果</h2> <code class="test23Result"></code> <br> <hr> 复制代码
❝
js
❞
// post 参数类型为 Object, FromData格式发送 const test2 = () => { http.request({ url: '/test/post', type: 'post', data: { name: 'post', age: 22, isFromData: true }, callback0: data => { document.querySelector('.test2Result').innerHTML = data; } }) }; // post 参数类型为 Object, FromData格式发送 const test22 = () => { http.request({ url: '/test/post22', type: 'post', data: { name: 'post', age: 22, isFromData: true }, callback0: data => { document.querySelector('.test2Result').innerHTML = data; } }) }; // post 参数类型为 Object, 以JSON格式发送 const test23 = () => { http.request({ url: '/test/post23', type: 'post', data: { name: 'post', age: 23, isFromData: false }, callback0: data => { document.querySelector('.test23Result').innerHTML = data; } }) }; 复制代码
❝
结果
❞
参数类型List时候,请求头Content-Type设置为application/json;使用@RequestBody注解;
3.5.1 List 类型1
❝
当参数类型List为:此时单个list中有单个Map, Map里面没有List
❞
[ { name: 'post2', age: 22 }, { name: 'post3', age: 23 } ] 复制代码
// 数组接收 @PostMapping("/post3") public Object testPost3(@RequestBody List<Test> data) { ArrayList<Object> result = new ArrayList<>(); Map<String, Object> testMap = new HashMap<>(); for (Test test : data) { // 逻辑处理在这里 testMap.put("name", test.getName()); testMap.put("age", test.getAge()); result.add(testMap); } return result; } 复制代码
此时的实体类:com.scaffold.test.entity.Test
@Data @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class Test implements Serializable { private static final long serialVersionUID=1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private String name; private String age; } 复制代码
此时的html
:
<!--POST: 数组(纯数组)--> <h1>test POST: 数组(纯数组)</h1> <code> POST [ { name: 'post2', age: 22 }, { name: 'post3', age: 23 } ] </code> <br/> <br/> <button onclick="test3()">点击测试</button> <h2>test3 结果</h2> <code class="test3Result"></code> <br> <hr> 复制代码
此时的Js
:
// POST 参数类型为 list const test3 = () => { http.request({ url: '/test/post3', type: 'post', data: [ { name: 'post2', age: 22 }, { name: 'post3', age: 23 } ], callback0: data => { document.querySelector('.test3Result').innerHTML = data; } }) }; 复制代码
结果
❞3.5.2 list 类型2
[ { "name": "post2", "age": 22, "list": [ { "name": "post22", "age": 2233 } ] }, { "name": "post3", "age": 23, "list": [ { "name": "post33", "age": 2233 } ] } ] 复制代码
❝
此时我们的实体类:com.scaffold.test.entity.TestList
❞
@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class TestList { private String name; private int age; private List<Test> list; } 复制代码
// 数组接收, map里面还有数组类型 @PostMapping("/post5") public Object testPost5(@RequestBody List<TestList> testList) { return testList; } 复制代码
❝
html
❞
<!--POST传参: 数组中有map, map中还包括数组--> <h1>test POST传参: 数组中有map, map中还包括数组</h1> <code> POST [ { name: 'post2', age: 22, list: [ { name: 'post22', age: 2233, } ] }, { name: 'post3', age: 23, list: [ { name: 'post33', age: 2233, } ] } ] </code> <br/> <br/> <button onclick="test5()">点击测试</button> <h2>test5 结果</h2> <code class="test5Result"></code> <br> <hr> 复制代码
❝
js
❞
// 测试方法5 const test5 = () => { http.request({ url: '/test/post5', type: 'post', data: [ { name: 'post2', age: 22, list: [ { name: 'post22', age: 2233, } ] }, { name: 'post3', age: 23, list: [ { name: 'post33', age: 2233, } ] } ], callback0: data => { document.querySelector('.test5Result').innerHTML = data; } }) }; 复制代码
❝
结果
❞
❝
src/main/resources/templates/js/test.js
❞
//封装HTTP请求方法 const http = { // 请求方法 request: (params = {}) => { // 默认参数和参数合并 const requestParams = Object.assign({ type: 'GET', url: '', dateType: 'json',//请求返回结果类型 data: { // 请求参数 }, headers: { // 请求头 }, callback0: () => { // 报文成功返回后回调 } }, params); // 请求 const xhr = new XMLHttpRequest(); // 请求方法 const {type, data, url, headers} = requestParams; const requestMethod = ('' + type).toLocaleLowerCase(); // url 是否携带参数 const urlHasParams = requestMethod === 'get'; const requestUrl = urlHasParams ? http.getUrlString(url, data) : url; // 参数类型 const dataType = Object.prototype.toString.apply(data); xhr.open(type, requestUrl); // @ResponseBody注解,接收参数时,必须是application/json // POST请求不以FromData格式时 if (dataType === '[object Array]' || (requestMethod == 'post' && !data.isFromData)) { xhr.setRequestHeader("Content-type", "application/json; charset=utf-8"); } // 自定义表头 Object.keys(headers).forEach(m => { xhr.setRequestHeader(m, headers[m]); }); xhr.addEventListener("load", e => { const status = xhr.status; if (status === 200) { requestParams.callback0(xhr.response); } else { console.log(e); } }); xhr.send(urlHasParams ? null : http.getFormData(data)); }, // Object 转化为 String getQueryString: (data = {}) => { let _r = []; Object.keys(data).forEach(m => { _r.push(`${m}=${JSON.stringify(data[m])}`); }); _r = _r.join('&'); return _r; }, // GET 请求,参数合并到URL上 getUrlString: (url, data) => { return url.includes('?') ? url + '&' + http.getQueryString(data) : url + '?' + http.getQueryString(data); }, // formData getFormData: data => { const dataType = Object.prototype.toString.apply(data); // Object // isFromData标注是否使用FromData方式发送参数 if (dataType === '[object Object]' && data.isFromData) { const formData = new FormData(); Object.keys(data).forEach(m => { formData.append(m, data[m]); }); return formData; } else { // Array || Object(JSON格式传参) return JSON.stringify(data); } } }; // GET 参数类型为 Object const test1 = () => { http.request({ url: '/test/get', type: 'get', data: { name: 'get', age: 22 }, callback0: data => { document.querySelector('.test1Result').innerHTML = data; } }) }; // Get 参数存在于路径中 const testPath = () => { http.request({ url: '/test/path/6666', type: 'get', data: { name: '111', }, callback0: data => { document.querySelector('.testPathResult').innerHTML = data; } }) }; // post 参数类型为 Object, FromData格式发送 const test2 = () => { http.request({ url: '/test/post', type: 'post', data: { name: 'post', age: 22, isFromData: true }, callback0: data => { document.querySelector('.test2Result').innerHTML = data; } }) }; // post 参数类型为 Object, FromData格式发送 const test22 = () => { http.request({ url: '/test/post22', type: 'post', data: { name: 'post', age: 22, isFromData: true }, callback0: data => { document.querySelector('.test2Result').innerHTML = data; } }) }; // post 参数类型为 Object, 以JSON格式发送 const test23 = () => { http.request({ url: '/test/post23', type: 'post', data: { name: 'post', age: 23, isFromData: false }, callback0: data => { document.querySelector('.test23Result').innerHTML = data; } }) }; // POST 参数类型为 list const test3 = () => { http.request({ url: '/test/post3', type: 'post', data: [ { name: 'post2', age: 22 }, { name: 'post3', age: 23 } ], callback0: data => { document.querySelector('.test3Result').innerHTML = data; } }) }; // GET 获取数组ID const test4 = () => { http.request({ url: '/test/getList', type: 'get', data: { productId: '1,2,3' }, callback0: data => { document.querySelector('.test4Result').innerHTML = data; } }) }; // 获取请求头数据 const testHeader = () => { http.request({ url: '/test/header', type: 'post', headers: { privateHeader: "test88888", privateHeader2: "test888882", }, callback0: data => { document.querySelector('.testHeaderResult').innerHTML = data; } }) }; // 获取所有请求头数据 const testHeaders = () => { http.request({ url: '/test/headers', type: 'get', headers: { privateHeader: "test888881", privateHeader2: "test888882", privateHeader3: "test888883", }, callback0: data => { document.querySelector('.testHeadersResult').innerHTML = data; } }) }; // 测试方法5 const test5 = () => { http.request({ url: '/test/post5', type: 'post', data: [ { name: 'post2', age: 22, list: [ { name: 'post22', age: 2233, } ] }, { name: 'post3', age: 23, list: [ { name: 'post33', age: 2233, } ] } ], callback0: data => { document.querySelector('.test5Result').innerHTML = data; } }) }; 复制代码
❝
src/main/resources/templates/test.html
❞
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> <style> body { background: #333; color: #999; } hr { border: none; height: 1px; background: #999; } code { color: dodgerblue; } </style> </head> <body> <!--GET: 单个参数--> <h1>test GET传参: 单个参数</h1> <code>http://localhost:9002/test/get?name=11&age=22</code> <br> <code> GET { name: 'get', age: 22 } </code> <br/> <br/> <button onclick="test1()">点击测试</button> <h2>test1 结果</h2> <code class="test1Result"></code> <br> <hr> <!--GET: 路径中携带参数--> <h1>test GET: 路径中携带参数</h1> <code>http://localhost:9002/test/path/6666?name=11</code> <br> <code> GET { name: '11' } </code> <br/> <br/> <button onclick="testPath()">点击测试</button> <h2>testPath 结果</h2> <code class="testPathResult"></code> <br> <hr> <!--GET: 参数数组--> <h1>test GET传参: 数组</h1> <code>http://localhost:9002/test/getList?productId=1,2,3</code> <br> <code> GET { productId: 1,2,3 } </code> <br/> <br/> <button onclick="test4()">点击测试</button> <h2>test4 结果</h2> <code class="test4Result"></code> <br> <hr> <!--GET || POST : 获取请求头中数据--> <h1>test GET || POST : 获取请求头中数据</h1> <code>http://localhost:9002/test/header</code> <br> <code> GET || POST headers: { privateHeader: "test88888", privateHeader2: "test888882", } </code> <br/> <br/> <button onclick="testHeader()">点击测试</button> <h2>testHeader 结果</h2> <code class="testHeaderResult"></code> <br> <hr> <!--GET || POST: 获取请求头中所有的数据--> <h1>test GET || POST : 获取请求头中所有的数据</h1> <code>http://localhost:9002/test/headers</code> <br> <code> GET || POST headers: { privateHeader: "test888881", privateHeader2: "test888882", privateHeader3: "test888883", } </code> <br/> <br/> <button onclick="testHeaders()">点击测试</button> <h2>testHeaders 结果</h2> <code class="testHeadersResult"></code> <br> <hr> <!--POST:单个参数,FromData格式--> <h1>test POST:单个参数,FromData格式</h1> <code> POST { name: 'post', age: 22 } </code> <br/> <br/> <button onclick="test2()">点击测试</button> <h2>test2 结果</h2> <code class="test2Result"></code> <br> <hr><!--POST:单个参数,以JSON格式发送--> <h1>test POST:单个参数,以JSON格式发送</h1> <code> POST { name: 'post', age: 23 } </code> <br/> <br/> <button onclick="test23()">点击测试</button> <h2>test23 结果</h2> <code class="test23Result"></code> <br> <hr> <!--POST: 数组(纯数组)--> <h1>test POST: 数组(纯数组)</h1> <code> POST [ { name: 'post2', age: 22 }, { name: 'post3', age: 23 } ] </code> <br/> <br/> <button onclick="test3()">点击测试</button> <h2>test3 结果</h2> <code class="test3Result"></code> <br> <hr> <!--POST传参: 数组中有map, map中还包括数组--> <h1>test POST传参: 数组中有map, map中还包括数组</h1> <code> POST [ { name: 'post2', age: 22, list: [ { name: 'post22', age: 2233, } ] }, { name: 'post3', age: 23, list: [ { name: 'post33', age: 2233, } ] } ] </code> <br/> <br/> <button onclick="test5()">点击测试</button> <h2>test5 结果</h2> <code class="test5Result"></code> <br> <hr> <script src="./js/test.js"></script> </body> </html> 复制代码
❝
com.scaffold.test.controller.TestController
❞
package com.scaffold.test.controller; import com.scaffold.test.entity.Test; import com.scaffold.test.entity.TestList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> * 前端控制器 * </p> * * @author alex wong * @since 2020-06-23 */ @RestController @RequestMapping("/test") public class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); @GetMapping("/get") public Object testGet(@RequestParam String name, @RequestParam int age) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", name); result.put("age", age); return result; } // 数组接收 @GetMapping("/getList") public Object testGet4(@RequestParam String[] productId) { ArrayList<Object> list = new ArrayList<>(); for (String id : productId) { // 数据处理 list.add(id); } return list; } // 路径 @GetMapping("/path/{id}") public Object testId(@PathVariable String id, @RequestParam String name) { Map<String, Object> map = new HashMap<>(); map.put("id", id); map.put("name", name); return map; } // @RequestParam 单个参数接收------前端使用FromData @PostMapping("/post") public Object testPost(@RequestParam String name, @RequestParam int age) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", name); result.put("age", age); return result; } // 实体类接收:不加注解------前端使用FromData @PostMapping("/post22") public Object testPost22(Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } // @RequestBody 实体类接收 @PostMapping("/post23") public Object testPost23(@RequestBody Test data) { Map<String, Object> result = new HashMap<>(); // 数据处理 result.put("name", data.getName()); result.put("age", data.getAge()); return result; } // 数组接收 @PostMapping("/post3") public Object testPost3(@RequestBody List<Test> data) { ArrayList<Object> result = new ArrayList<>(); Map<String, Object> testMap = new HashMap<>(); for (Test test : data) { // 逻辑处理在这里 testMap.put("name", test.getName()); testMap.put("age", test.getAge()); result.add(testMap); } return result; } // 数组接收, map里面还有数组类型 @PostMapping("/post5") public Object testPost5(@RequestBody List<TestList> testList) { return testList; } // 获取请求头 @RequestMapping("/header") public Object getHeader(@RequestHeader(name = "privateHeader") String privateHeader, @RequestHeader(name = "privateHeader2") String privateHeader2) { HashMap<Object, Object> map = new HashMap<>(); map.put("privateHeader", privateHeader); map.put("privateHeader2", privateHeader2); return map; } // 获取所有的请求头 @RequestMapping("/headers") public Object getAllHeader(HttpServletRequest request) { Map<Object, Object> resultHeader = new HashMap<>(); resultHeader.put("privateHeader", request.getHeader("privateHeader")); resultHeader.put("privateHeader2", request.getHeader("privateHeader2")); resultHeader.put("privateHeader3", request.getHeader("privateHeader3")); return resultHeader; } // 获取Cookie @RequestMapping("/cookie") public Object getCookie(@CookieValue(name = "token") String token) { return token; } } 复制代码
❝
实体类
❞
❝
com.scaffold.test.entity.Test
❞
package com.scaffold.test.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * @author alex wong * @since 2020-06-23 */ @Data @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class Test implements Serializable { private static final long serialVersionUID=1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private String name; private String age; } 复制代码
❝
com.scaffold.test.entity.TestList
❞
package com.scaffold.test.entity; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class TestList { private String name; private int age; private List<Test> list; } 复制代码
本文使用 mdnice 排版