简单理解HTTP的GET和POST
当用户首次登录一个网站时,会出现这个网站的登录页,用户输入账号和密码后,单击“提交”按钮,如果认证通过则登录成功。这个过程中网页和后台服务器多次交互,这中间到底发生了哪些事情呢?
用户在浏览器的地址栏中输入一个网站的登录页地址,目的是从服务器上拉取登录页的HTML文件。在这个过程中,浏览器向后台发起了HTTP GET的请求(这个请求也可能是从其他页面中的链接发起的),登录页比较常见的 URL 形式是http://xxx/login。
从GET请求这个名字中,读者大致可以猜到,这种类型的请求是从服务器拉取资源而不改变服务器的资源。
浏览器收到登录页的 HTML 文件并解析后,用户看到的是用户名和密码的输入界面,输入后单击“提交”按钮,这时浏览器又向后台发了一个请求,不过发这次请求时,用户并没有在地址栏输入什么,地址栏的内容也没有立刻发生改变(一般情况下,打开链接后,地址栏的内容会立刻发生改变)。这次,向后台发起的是HTTP POST请求,从POST的名字中读者可以大致猜到,这种类型的请求会带一些发起者的数据并让服务器发生一些改变。
所以通常认为GET 就是拉取服务器的数据,POST 就是向服务器提交数据,但实际上两者并没有这种明确的界限,前端开发人员有时很任性,怎么操作方便怎么来,所以用户经常会在登录页输入账号和密码,登录后看到地址栏立刻从 http://xxx/login变成了http://xxx/login?username=xxxx&password=xxxx。
当然,敏感信息是经过加密的,上述例子中,页面直接将登录信息补到URL中并发起了一次HTTP GET的请求。
有时,因为有的操作用 HTTP GET 不太方便,所以前端开发人员更依赖 HTTP POST 的操作。以上传一张图片为例,将图片数据编码后添加到 URL 后面的参数中传给服务器是可行的,只是有的浏览器(比如IE)对URL的长度有限制,所以前端开发会觉得一会用POST传数据,一会用GET传数据太麻烦,传数据干脆全用POST好了。
HTTP POST请求将需要携带的信息放在HTTP请求的数据字段中,在URL中是看不到的,所以有时用户在页面里操作,页面一直在变化,但是地址栏的URL却一直没变过(这只是一种原因,很多Web技术都可以实现这种效果)。
后台开发人员则会做兼容处理,一般都会同时支持HTTP GET和HTTP POST来取或传数据,做到只关心数据内容而不关心传送形式。