接口
每个应用都有可能需要对外提供数据接口,尤其是Web应用。比如下图,你看到的页面可能是来住很多个不同应用。
目前,Web接口大致有这么几种类型:
1) 直接读取应用的数据库
这种方式的特点就是高效,缺点耦合性比较高
2) 通过公共代码库的方式
其他应用程序直接调用代码库就可以了,这种方式的优点就是封装了实现的细节,调用者不需要关心实现,而关注接口即可。缺点就是如果接口改变了,需要升级代码库,如果应用数量很多,升级的周期会比较长。
3) HTTP方式调用
由于Web应用的特点,采用HTTP方式调用,将需要调用的数据封装成HTML形式,直接包含在页面上。这种具体又可以分为JS调用和后台Import调用。这种方式也是主流的方式,具体后面再谈。
4) REST 方式调用,如果应用很多,接口也很多,这样要管理接口就会比较麻烦了,所以采用REST方式把所有接口统一组织管理起来,提高了开发效率。本质上这也是一种HTTP调用。
5) 类似Gadget方式调用,Gadget是Google 提出来的一种应用标准,可以将接口封装成Gadget形式。这种方式更易于管理,不过开发速度要稍微慢点。本质上这也是一种HTTP调用。
接下来重点分析一下HTTP调用的2种形式的优缺点。
JS调用和Import方式调用
JS调用
来看一下JS调用的具体例子
页面上的这块评论来自于评论系统的接口,这个接口直接返回了生成好的HTML
http://www.tudou.com/comments/itemcomment.srv?method=get&r=1&iid=20038766&page=1&tm=1&ban=1 。
由于Javascript 是阻塞页面的,所以JS接口通常会采用异步方式加载,比如将JS接口放在尾部加载出来。
这种方式的优点就是提高了页面的加载速度,但如果是对于慢速网络用户,可能要过很久才能看到评论,另外非常致命的缺点在于这部分的内容是搜索引擎无法检索到的。
来看一下土豆首页,会明显感觉到右上角先是一个空白,然后再出来。
如果是采用阻塞方式调用的话,缺点就是会等待,但内容是立即显示出来的。
另外,从数据格式来看,这种JS调用没有将显示和数据分离,如果要做其他版式的接口,就只能重新开发了。因此十分有必要将数据和现实进行分离。接口只提供数据,显示由具体调用的应用来实现,这种方式在REST里也有体现。
总结一下:
JS调用 | 缺点 | 优点 | 使用的场合 | |
阻塞式调用 | 页面会等待 无法SEO | 内容立即显示 | 客户广告,因为肯定不希望广告最后出来 | |
非阻塞式调用 | 不能立即看到内容 无法SEO | 提高页面响应速度 | 大数据加载或者非重要数据 | |
数据和现实分离 | 不能立即看到内容无法SEO | 可以自定义版式 | 采用JSON/XML格式, |
现在来看讨论一个高级话题:如何解决JS调用数据的SEO问题?
此问题没有标准答案,我也不知道答案,仅把一些实验结果分享一下。
对着第一个图,来看,有2点比较有争议:
1. 采用非阻塞式JS调用,SEO基本没可能
2. 这个页面的SEO权重会被降低,因为从页面结构上来说,评论是这个页面的主体内容,如果无法SEO,这个URL的权重会大大降低。
针对第一点,经过实践证明,采用下面这种方式可以改进SEO。
主要的手法,就是先用一个链接引导搜索爬虫去检索这个链接,对于用户来说,这个链接的内容将会在页面加载完毕后出现。
针对第二点,暂时无解!唯一能避免的就是采用第二种调用方式,Import方式。
期待你的答案
Import方式
Import方式是指将页面所需要的内容都统一生成好后,再提供给用户。具体的方式大致有以下几种:
1) SSI方式,此种方式不能跨服务器
2) 动态包含 <c:import /> <jsp:include /> ... 等,可以包含动态
3) 自定义包含方式 <project:cache url="xxxx" />
不管采用哪种方式,缺点都是一样的,就是对于动态或者变化比较快的内容,效率就不够高。但对于非动态内容,采用这种方式可以增加Expire,提高CDN对网页的缓存,加快用户的访问速度。
总结
对需要提供接口的应用来说,接口应该根据被调用的应用的特点来区分对待,如果是静态应用,可以提供import 形式接口,对于动态应用,提供JS形式接口