application/json
服务器端使用spring boot
@RestControllerpublic class GreetingController { //解析application/json @RequestMapping(value = "/hello", method = RequestMethod.POST) public Object getJson(@RequestBody Object obj) { return obj; } }
客户端,原生ajax
var xhr = new XMLHttpRequest() xhr.onreadystatechange = function (ev) { console.log(xhr.readyState); if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } } }; xhr.open('POST','/hello'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify({ name:'zhuwei', age:'25', hobby:'ball'}))
浏览器请求详情
1534052079504.png
application/x-www-form-urlencoded
服务端,springboot
@RestControllerpublic class GreetingController { //解析application/x-www-form-urlencoded @RequestMapping(value = "/helloFormUrl", method = RequestMethod.POST) public String getForm(@RequestParam("name") String name,@RequestParam("age") String age) { return "name="+name+"&"+"age="+age; } }
客户端,html form 表单
<form action="/helloFormUrl" method="post"> <input type="text" name="name"> <input type="text" name="age"> <input type="submit"></form>
或者使用 ajax
var xhr = new XMLHttpRequest() xhr.onreadystatechange = function (ev) { console.log(xhr.readyState); if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } } }; //生成 post 参数 params,有三种方法,选一种 //1. 使用URLSearchParams 接口,会对内容进行utf8编码 const params = new URLSearchParams(); params.append('name', '小明'); params.append('age', '18'); //2.使用encodeURIComponent 对内容进行编码 //好处是url中的汉字等一些特殊字符会被转为utf8编码,减少出错 const params = "name="+encodeURIComponent("小明")+"&age="+encodeURIComponent("19") //3.不编码直接写,可能服务端会解码错误 const params = "name=小明&age=19" xhr.open('POST','http://localhost:1234/helloFormUrl'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(params)
浏览器请求详情
1534052194567.png
multipart/form-data
1.发送键值对
服务端,springboot(和 application/x-www-form-urlencoded 的代码相同)
@RequestMapping(value = "/helloFormUrl", method = RequestMethod.POST) public String getForm(@RequestParam("name") String name,@RequestParam("age") String age) { return "name="+name+"&"+"age="+age; }
客户端,ajax。
注意:
使用FormData()生成数据
不手动添加
content-type
请求头
var xhr = new XMLHttpRequest() xhr.onreadystatechange = function (ev) { console.log(xhr.readyState); if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } } }; const params = new FormData(); params.append('name', '朱维'); params.append('age', '18'); xhr.open('POST','http://localhost:1234/helloFormUrl'); xhr.send(params)
1534061691216.png
2.发送文件
服务端代码
@CrossOrigin@RestControllerpublic class GreetingController { @RequestMapping(value = "/helloFile", method = RequestMethod.POST) public void getFile(@RequestParam("file") MultipartFile file) { System.out.print(file.getSize()); } }
客户端采用<input type=file>
发送文件
注意:form需要加上enctype="multipart/form-data",因为form表单的默认编码方式是application/x-www-form-urlencoded
<form action="http://localhost:1234/helloFile" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"></form>
text/plain
服务端
@RequestMapping(value = "/helloText", method = RequestMethod.POST) public void getText(@RequestBody String str) { System.out.print(str); }
客户端
var xhr = new XMLHttpRequest() xhr.onreadystatechange = function (ev) { console.log(xhr.readyState); if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } } }; xhr.open('POST','http://localhost:1234/helloText'); xhr.setRequestHeader('Content-Type', 'text/plain'); xhr.send('我是小明')
1534067062907.png
总结
POST常用发送方式有四种,其实是http请求的四种
content-type
application/json
application/x-www-form-urlencoded
multipart/form-data
text/plain
表单提交默认使用 application/x-www-form-urlencoded
,可以通过设置enctype属性改变默认提交方式,表单不支持application/json类型。想发json类型的请求,只能通过ajax。
上传文件只能通过multipart/form-data
,但multipart/form-data
也可以传键值对
PS:本文并没有涉及太多的细节讲解,因为本人也是刚开始学习POST请求,所以总结了一些学习过程中做的demo代码,如果有写得不恰当的地方,还请指正。
Refrence
关于URL编码-阮一峰
Spring web annotations
阮一峰js标准参考教程-ajax
作者:朱小维
链接:https://www.jianshu.com/p/2ba4cde90e95