文档章节

为什么大家都在讨论API?

王振威
 王振威
发布于 2012/05/12 09:50
字数 1316
阅读 6377
收藏 23

    这篇文章尝试回答现在经常被提到的一个问题:为什么大家都在讨论API?我们如何创建API

服务器和客户端

    10年前,web服务器的工作只是构建一个HTML页面,给表现层的客户端提供一个不灵活的展现。而Javascript的角色就是在不同的浏览器中实现<blink>标签。

    而现在我们已经可以在浏览器中执行一些可靠的图灵机运算,例如Ajax请求,而Javascript也承担了越来越多的责任。

    Ajax可以让我们通过一个XMLHttpRequest对象在网页不重新装载的情况下只更新一块或者一部分窗口,浏览器与服务器之间的通信加载的并不是一个完整的HTML页面,加载的很可能只是需要的信息,而这会使用户得到更好的用户体验,也使网页看起来动态化。

看如下请求:

POST /users
GET /users/1 #following the redirect
PUT /users/1/enabled

他们返回的都不是HTML,而是JSON或者XML

    我听过 加布里埃莱·拉娜在米兰  上周的一个关于怎样实现基于HTTP协议的使业务逻辑(服务器暴漏接口)和页面展现(客户端Javascript展示)分离的讨论。甚至于你的服务器只是用来接收请求发送HTML页面,也强制分为两层实现。使服务器业务逻辑和前端展现独立的实现,他们可以使用不同的机器配置和语言实现。

新的可能性

    除了使用Flex重写你的前端,或者Scala重写你的业务逻辑,(因为这两种东西的边界非常清晰,使用他们重写可以清晰的划分开业务逻辑和展现),还有几种基于HTTP的几种可能性实现(我并不称之为REST):

·可以创建新的前端:首先想到的就是移动Web应用程序和移动的原生应用程序。业务逻辑层仍然共享,只是他们用不同的语言实现不同的UI罢了。

·整合应用程序的服务层,不是简单的吧数据库接口共享,我们需要通过一个更严格的API隔离一些操作,而不是暴漏每一个表结构,让基于API的应用程序独立开来,从而避免数据模型的意外状况。

·使用API提供访问的方式有可能要比其他的方式有优势。

·如果你们的应用很有意思,你可以提供第三方访问的API(甚至收费)。

·开放性数据的想法是通过一个API来访问政府的数据,如果以原始的方式在公开的网站上发布的话,你必须迁移这些数据到你自己的硬盘上。

挑战

    由于浏览器是不能够执行PUT或者DELETE请求的,浏览器只能实现GETPOST请求,这个问题导致我们在需要这种请求的时候必须以POST的方式加一个额外的参数,服务器在收到这个参数的时候再重新实现POST的请求处理。例如

POST /users/1/enabled?_method=put

    POSTGET不同的是他的语义是修改应用程序状态,但是他并不是安全的,目前还不清楚HTML5中是否会增加PUTDELETE请求表单的支持。

    另一个问题是延迟,HTTP请求必须满足一定的最小往返时间,现在已经有一个叫做SPDY的东西在尝试使HTTP延迟变小,但是通过初始化多个不同的Ajax请求来组成一个页面并不好,通常浏览器在一个时间域内最多同时发送6个请求。幸运的是,你可以把页面上的内容分块独立的缓存,而不需要使用一些所谓的HTTP加速器。

历史

    最后一个潜在的问题,就是如何管理历史页面,例如如何使后退按钮良好的工作。默认情况下完成Ajax请求并不会改变地址栏的URL,这就意味着,不能使用后退按钮回到之前的页面。

    现在的HTML5History提供了一个API用来修改URL,他可以让你在不重新加载页面的情况下把 /users改为/users1

    而在老的浏览器中,也有降级的曲线解决办法,你可提供一个链接到新的页面,然后拦截他的click事件,装载Ajax请求,通过Javascript更新History

总结

    鉴于目前浏览器的功能,使用JSON或者XML API作为HTTP服务器的输出终点会是一种很好的设计,此外,如果世界范围都有通用的基于HTTPAPI,将会使世界各地的客户端访问相同的业务逻辑,客户端、服务器只需遵循一定的API规则,服务器和客户端将独立发展,将会在技术、部署,甚至开发语言中获益。


OSchina.NET原创翻译/原文链接

© 著作权归作者所有

共有 人打赏支持
王振威

王振威

粉丝 500
博文 28
码字总数 20820
作品 0
深圳
程序员
加载中

评论(13)

weloglog
weloglog
哥,你的标题很有创意啊,可以得到一个最佳创意奖拿回家了,我是奔着API进来的,看的我头疼,
滴滴丶哔哔
滴滴丶哔哔
文章内容和标题,毛关系没有,标题党。
Honghe
Honghe
如果是译文, 在开头应该先声明相关信息,
不要让人看到结尾才知道是译文
小可丶同学
小可丶同学
管他谁收购谁,谁竞争谁,我就做好我自己的就行了。O(∩_∩)O~
汪林
汪林

引用来自“Kut.Zhang”的评论

api,我想是因为关注到oracle和google之争吧?和你这个没半毛钱关系。

oracle收购了sun后开出了Java之父高斯林,而高斯林现在又进了goole。之间的商业竞争,这套api是由sun开发的。
kut
kut
api,我想是因为关注到oracle和google之争吧?和你这个没半毛钱关系。
王振威
王振威

引用来自“BEILUTE00”的评论

一头雾水

简单的一句话说就是web服务器只针对请求返回XML或者json,客户端拿到数据后可以针对不同的平台做不同的展现方式,比如你是HTML,或者你是移动客户端,而这些服务器并不关心
射会主意老韭菜
射会主意老韭菜
一头雾水
renwofei423
renwofei423
有心就不错!
zhaoyou
zhaoyou
翻译的太烂!
几种常见结构化数据的比较

在我刚接触windows编程的时候,一般用.ini文件。 后来,都是自己定义数据格式,自己实现数据的读写。 再后来,就是xml了,那时我比较习惯使用tinyXml。 现在呢?大家都在用Json。 为了追求性...

jacksonke
2015/10/03
315
0
有人使用 spring boot 来写 web项目吗?

最近也是为了熟悉下SpringBoot的使用,就找了一个web项目练练手,修改为spring boot方式的,使用spring boot有一些疑问,拿出来与大家讨论一下,有说的不对的地方请大家指教。 使用spring bo...

小杨阿哥哥
2017/07/18
514
5
开源库推荐文章

FcPermissions:也许是目前最好的动态权限请求库 一个简洁方便的处理 Android M 上动态权限的库 Android 常用三方框架的学习 Android 常用三方框架的学习 值得每个人收藏的《下拉刷新与加载更...

掘金官方
2017/12/12
0
0
PHP语言最令人“抓狂”的十二种特性

【IT168 技术】命名约定前后矛盾、版本兼容相互冲突,PHP语言在各个层面上都给开发人员带来了诡异而难解的谜局――这就是我们今天要讨论的话题。我们真的对PHP深恶痛绝吗?不,当然不是。如果...

it168网站
2014/05/20
0
0
论移动互联网测试还能活火多久

  群里说要讨论下移动互联网目前的测试情况,我来说下这几年的变化和情况把。其实你们自己感觉就可以感觉的出来是不是有前景。   我的观点是“移动互联网肯定是会火的,而且肯定会继续火...

糖糖豆豆
2014/11/25
127
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部