在常见业务开发中,POST 请求常常在这些地方使用:前端表单提交时、调用接口代码时和使用 Postman 测试接口时。我们下面来一一了解:
一、前端表单提交时
application/x-www-form-urlencoded
表单代码:
<form action="http://localhost:8888/task/" method="POST"> |
通过测试发现可以正常访问接口,在 Chrome 的开发者工具中可以看出,表单上传编码格式为 application/x-www-form-urlencoded
(Request Headers 中),参数的格式为 key=value&key=value
。
我们可以看出,服务器知道参数用符号 &
间隔,如果参数值中需要 &
,则必须对其进行编码。编码格式就是 application/x-www-form-urlencoded
(将键值对的参数用 & 连接起来,如果有空格,将空格转换为 +
加号;有特殊符号,将特殊符号转换为 ASCII HEX
值)。
application/x-www-form-urlencoded
是浏览器默认的编码格式。对于 Get 请求,是将参数转换 ?key=value&key=value
格式,连接到 url 后
ps:可以在这个网址测试表单:http://www.runoob.com/try/try.php?filename=tryhtml_form_submit
multipart/form-data
那么当服务器使用 multipart/form-data
接收 POST 请求时,服务器怎么知道每个参数的开始位置和结束位置呢?
<form action="http://localhost:8888/task/" method="POST" enctype="multipart/form-data"> |
我们在开发者工具中可以看出 multipart/form-data
不会对参数编码,使用的 boundary
(分割线),相当于 &
,boundary
的值是 ----Web*AJv3
。
文件上传
上传文件也要指定编码格式为 multipart/form-data
。
<form action="http://localhost:8888/testFile" enctype="multipart/form-data" method="POST"> |
如果是 SpringMVC 项目,要服务器能接受 multipart/form-data
类型参数,还要在 spring 上下文配置以下内容,SpringBoot 项目则不需要。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> |
我们可以通过 FormData 对象模拟表单提交,用原始的 XMLHttpRequest 来发送数据,让我们可以在 Chrome 开发工具中查看到具体格式:
<form id="form"> |
格式如下:
二、调用接口代码时
1、在代码中使用 application/x-www-form-urlencoded
编码格式设置 Request 属性调用接口,可以如下实现:
private static String doPost(String strUrl, String content) { |
2、在代码中使用 multipart/form-data
编码格式设置 Request 属性调用接口时,其中 boundary
的值可以在设置 Content-Type 时指定,让服务器知道如何拆分它接受的参数。通过以下代码的调用接口:
private static String doPost(String strUrl, Map<String, String> params, String boundary) { |
通过 debug,可以看出 dataOutputStream 的值如下:
三、使用 Postman 测试接口时
1、POST 请求 -> Body -> x-www-form-urlencoded
当切换为 x-www-form-urlencoded
时,Headers 会自动添加 Content-Type:application/x-www-form-urlencoded
当请求 Send 后,此时点 Code
,可以查看到和 Chrome 开发工具中 (Request Headers 处的 Content-Type 和 Form Data) 一样的数据
2、POST 请求 -> Body -> form-data
相当于 html 表单请求,value 可为 Text 或文件。
可以不用手动指定编码格式,也可以指定编码为 multipart/form-data
划线处的分割线应该是被省略了。
可以更改左上角的类型,来查看相应的 Headers 代码,常见的是下面三种:
Java OK HTTP:
JavaScript Jquery AJAX:
JavaScript XHR:
接口代码
"/task") ( |
总结
POST 请求的两种编码格式:application/x-www-urlencoded
是浏览器默认的编码格式,用于键值对参数,参数之间用 &
间隔;multipart/form-data
常用于文件等二进制,也可用于键值对参数,最后连接成一串字符传输 (参考 Java OK HTTP)。除了这两个编码格式,还有 application/json
也经常使用。