<前文回顾>
<今日更新>
一、GET 和 POST:表单处理的“两把刷子”
在 JavaWeb 开发里,表单处理是“家常便饭”,而 GET 和 POST 这俩请求方式,就是处理表单的“两把刷子”。虽然它们都能“干活”,但用起来可是“天差地别”。GET 是“明枪”,POST 是“暗箭”,一个“光明正大”,一个“偷偷摸摸”。
1. GET:明枪易躲
GET 请求是 HTTP 协议里最常用的请求方式之一,它的特点就是“简单粗暴”。GET 请求会把参数拼在 URL 后面,像“挂羊头卖狗肉”一样,谁都能看见。
HTML Code |
<form action="submit" method="get"> <input type="text" name="username"> <input type="submit" value="提交"> </form> 运行 HTML 提交后,URL 会变成这样: /submit?username=张三 |
2. POST:暗箭难防
POST 请求是 HTTP 协议里另一种常用的请求方式,它的特点就是“低调内敛”。POST 请求会把参数放在请求体里,像“闷声发大财”一样,谁也不知道。
HTML Code |
<form action="submit" method="post"> <input type="text" name="username"> <input type="submit" value="提交"> </form> 运行 HTML 提交后,URL 不会变,参数藏在请求体里,只有服务器知道。 |
二、GET 和 POST 的“本质区别”
GET 和 POST 虽然都能“干活”,但它们的“本质区别”可不少。GET 是“查”,POST 是“改”,一个“只读不写”,一个“又读又写”。
1. 参数位置
GET 请求的参数是“挂”在 URL 后面的,像“尾巴”一样,谁都能看见。POST 请求的参数是“藏”在请求体里的,像“秘密”一样,只有服务器知道。
Java Code |
// GET 请求 String username = request.getParameter("username"); // POST 请求 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); |
2. 参数长度
GET 请求的参数长度是“有限”的,因为 URL 的长度是“有限”的。POST 请求的参数长度是“无限”的,因为请求体的长度是“无限”的。
3. 安全性
GET 请求的参数是“公开”的,谁都能看见,所以“不安全”。POST 请求的参数是“隐藏”的,只有服务器知道,所以“安全”。
4. 缓存
GET 请求是“可缓存”的,浏览器会把 GET 请求的结果缓存起来,下次再请求时直接从缓存里拿。POST 请求是“不可缓存”的,浏览器不会缓存 POST 请求的结果。
5. 幂等性
GET 请求是“幂等”的,多次请求的结果是一样的。POST 请求是“非幂等”的,多次请求的结果可能不一样。
三、GET 和 POST 的“使用场景”
GET 和 POST 虽然都能“干活”,但它们的“使用场景”可不一样。GET 是“查”,POST 是“改”,一个“只读不写”,一个“又读又写”。
1. GET 的使用场景
GET 请求适合用来“查”数据,比如搜索、分页、过滤啥的。GET 请求的参数是“公开”的,所以适合用来“查”数据。
HTML Code |
<form action="search" method="get"> <input type="text" name="keyword"> <input type="submit" value="搜索"> </form> |
2. POST 的使用场景
POST 请求适合用来“改”数据,比如登录、注册、提交啥的。POST 请求的参数是“隐藏”的,所以适合用来“改”数据。
HTML Code |
<form action="login" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="登录"> </form> |
四、GET 和 POST 的“历史”:从 HTTP/1.0 到 HTTP/2
GET 和 POST 从 HTTP/1.0 开始就有了,虽然现在 HTTP/2 已经“普及”了,但它们的“本质区别”依然没变。
1. HTTP/1.0:初代“两把刷子”
HTTP/1.0 在 1996 年发布,GET 和 POST 是它的“初代两把刷子”。虽然功能简单,但已经能满足大部分开发需求了。
2. HTTP/1.1:引入 PUT、DELETE
HTTP/1.1 在 1999 年发布,引入了 PUT、DELETE 这些新的请求方式,但 GET 和 POST 依然是“主力”。
3. HTTP/2:性能提升
HTTP/2 在 2015 年发布,性能提升了不少,但 GET 和 POST 的“本质区别”依然没变。
五、GET 和 POST 的“骚操作”
1. GET 的“骚操作”
GET 请求虽然“简单粗暴”,但也能“玩出花”来。比如,用 GET 请求下载文件,像“挂羊头卖狗肉”一样,谁都能看见。
Java Code |
response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"file.txt\""); InputStream in = new FileInputStream("/path/to/file.txt"); OutputStream out = response.getOutputStream(); byte[] buffer = new byte[4096]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.flush(); |
2. POST 的“骚操作”
POST 请求虽然“低调内敛”,但也能“玩出花”来。比如,用 POST 请求上传文件,像“闷声发大财”一样,谁也不知道。
HTML Java Code |
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); filePart.write("/uploads/" + fileName); out.println("文件上传成功!"); |
专有名词解释
- GET 请求:HTTP 协议中的一种请求方式,参数拼在 URL 后面,适合用来“查”数据。
- POST 请求:HTTP 协议中的一种请求方式,参数放在请求体里,适合用来“改”数据。
- 幂等性:多次请求的结果是一样的,GET 请求是幂等的,POST 请求是非幂等的。