首先,浏览器要想从后台拿东西,肯定是要发请求的,这个请求就是http请求,举一个最简单的例子,从浏览器输入网址,敲回车,访问一个页面。这个背后的过程,其实就是浏览器发送了一个get请求到后台的web server,然后后台程序中的路由部分,去对这个get请求进行了处理,然后把html页面作为响应返回给了browser,browser接受到这个响应,就直接把html渲染成页面展示出来。这里需要注意的是,发送http请求的方式有很多种,在浏览器里敲网址去发送get请求这一种方式,是浏览器自带的,这种方式一定会把响应体渲染到页面上去。
当然发送http请求还有其他的方式,比如通过提交form表单,也可以发送,这是比较常用的第二种方式。这第一种方式和第二种方式,都是浏览器自带的,是web开发中最基本也是最常用的发送请求方式。通常来说,第一种是get请求,第二种一般会是post请求。在web开发初期,http的请求方法里面,只有这两种。
在这个时候,页面一般都是通过后端程序生成出来的。也就是ssr,server side rendering,前端页面其实是配合后端程序用模板语言来写,毕竟如果你前端用html来写,那就是静态的,内容完全不会随着交互变的。这样做确实可以做到生成动态页面了,但是有一个问题,就是,不管你页面内容改动有多少,哪怕就是一个字的改动,这种方式,都会重新去生成整张页面,浏览器必须要去渲染整张页面,也就是1%的改动会牵扯到另外没有必要的99%的重复的部分,重新再渲染一遍。这种方式,肯定是不合理的,所以后来就诞生了ajax。ajax是浏览器的一个新功能,可以让浏览器异步发送http请求,并局部刷新页面。这样一来,就终于解决了以前必须渲染整张页面的问题。
可能这个ajax功能的开发的初衷,是为了解决动态页面生成时必须渲染整张页面的问题。然而,它的诞生,从整个web开发结构上,都产生了颠覆性的影响。回想一下上面所讲到的,在ssr时,写页面要写模板语言,否则如果写html页面的话,是没办法动态的。然而ajax的诞生,改变了这一点,你可以尽情的写html页面,需要动态改变的内容,通过ajax向后台发送请求,拿回来的数据通过js更新到页面上即可。于是乎,web开发前后端分离的结构就正式登场了。前端人员可以正常写原生的html了,不必再拘泥于后端规定要用哪一种模板语言。这样前后端的开发,只要大家统一好,需要变化的内容,规定一下数据怎么拿怎么传,其他都可以完全分离开发了。
事情发展到这里,前后端已经可以分离开发了。之前前后端必需坐着靠着,最好就隔壁隔,这样交流起来方便,为啥?因为要不停的问这个变量叫什么名字,那个变量叫什么名字,不然前端不认啊。还有很多其他需要互相问的地方,总之就是很多。那么现在,不用再坐着靠这么近了,一个在3楼一个在2楼也没事,因为只要你后端把数据格式定好了,基本就ok了。然后,就产生了这么一个情况,既然不在一层也行,那是不是不在一个楼里也行,是不是不在一个城市,甚至一个国家也行?答案是只要你把数据交互格式规定好,就行。另外,前端只要能从后台拿数据就行了,前端可以有很多种实现,不管你是用html还是js还是别的,只要你能发http请求,能拿回数据进行局部更新,那你前端怎么实现,后端根本不关心。既然是这样,那么就很容易联想到下面这一点了,我公司里只进行后端开发,想要用我功能的人,你自己去写一套前端就行了。那我公司以前是卖软件的,要卖就卖成套,开箱即用,那么现在我公司是不是可以只卖后端,买的人只要加工一个前端套在上面不就行了?这样,连整个销售方式都被影响了。
ok,既然是决定这么做了,那我公司除了把后端写好,是不是还要写好一个说明书,告诉买的人,你在套前端的时候,数据该这么拿该那么拿,也就是要把api写好给用户。打个比方,你想要创建一个用户,就发送这个a请求,它的方法是post,它的地址是blablabla...到这里都没毛病,用户也能看的懂,万事大吉。然而问题总是会不断出现,这样做的问题是什么呢,假设你想买一套后端程序来用,自己套前端,那么你就要读它的api,然后下一次我又买了一套其他公司的后端,又要读它的api,这两个api看起来差不多,但又完全不一样,真是烦死了,反正都是差不多实现的同一个功能,你们就不能都遵循一个规范来开发吗?这么说吧,你们AB两个公司的写的api,从组成形式上都不一样,那我用户就要从头读起,如果你们能遵循一个规范来,比如存数据就是用post,别A公司用post,B公司用get,那我读起来,也许就省了50%的力气吧。鉴于这样的需求,于是一套规范就被人们规定出来了,它就是restful api。
> restful api 规定了四个请求方法,get post put 和 delete,这四个请求方法分别,后端该做什么,规定了uri就是获取资源的唯一路径。等等。原来浏览器里面只认识get和post方法,现在为了响应这个规范,http协议,浏览器,以及web服务器,都分别把这几个请求方法加到了自己的功能里面去。所以现在,大家都遵循rest api方式去开发后端,就解决了上面说的那个问题了。