区别
- get表达的是一种幂等的,纯粹的只读操作,即它除了返回结果不应该会产生其它副作用(如写数据库)。因此绝大部分get请求(通常超过90%)都直接被CDN缓存了,这能大大减少web服务器的负担。
- 而post所表达的语义是非幂等的,可能进行增删改的操作,所以必须交由web服务器处理。
注意它们只是表达上的不同,强调语义。用get来传输要插入的数据,用post来传输要查询的数据标识都是可以的,只要请求打到了服务器上,管你是post还是get,怎么处理是服务器的事
post
-
一个最简单的用户名密码表单提交通常会会发送post request,请求头是这样的:
指明方法为post,还有实体头部信息包含请求体的内容长度与类型(x-www-form-urlencoded表示数据被编码为名称/值对,这是标准的编码格式。)。这是请求体:uname=&pwd=&sbt=%E6%8F%90%E4%BA%A4, 乱七八糟那部分就是‘提交’中文二字的utf-8编码。PS:若是传统表单按钮<input type="submit">提交,则会把提交按钮的value加入请求体。
有时post请求的content-type并非form格式数据,还可以是json格式数据。例如$.ajax()可以指定
$.ajax({
...
contentType: "application/json; charset=utf-8", dataType: "json",
data: JSON.stringify(obj)
...});
此时请求体:{"uname":"","pwd":""} 。
POST 是否比 GET 安全
POST要比GET安全一点点。。。两者都是明文传送,但是GET的URL会被放在浏览器历史和WEB 服务器日志里面,query会被记录;而POST 发完基本就木有了。所以如果关键数据放在GET里面,被人偷窥了浏览器,或者WEB服务器被入侵日志被人倒去了,基本泄露可能性100%。而POST来说,日志没有记录,只要数据库服务器不被入侵,基本还是安全的。
当然如果被抓了包,这一切都没有什么卵用,所以,HTTPS该用还是得用。
使用准则
- 可以重复的交互,比如取个数据,跳个页面, 用GET
- 不可以重复的操作, 比如创建一个条目/修改一条记录, 用POST, 因为POST不能被缓存,所以浏览器不会多次提交。