文档章节

为什么大家都在讨论API?

王振威
 王振威
发布于 2012/05/12 09:50
字数 1316
阅读 6376
收藏 23
点赞 0
评论 13

    这篇文章尝试回答现在经常被提到的一个问题:为什么大家都在讨论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原创翻译/原文链接

© 著作权归作者所有

共有 人打赏支持
王振威

王振威

粉丝 501
博文 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 ⋅ 0

有人使用 spring boot 来写 web项目吗?

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

小杨阿哥哥 ⋅ 2017/07/18 ⋅ 5

开源库推荐文章

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

掘金官方 ⋅ 2017/12/12 ⋅ 0

分享给大家几个好玩的网站

2009年9月15日 新增: http://tineye.com/ 可以帮助你查看你发现的网络上的图片的最初发布在哪里,查看究竟最早出自哪里 --------------------------------...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

PHP语言最令人“抓狂”的十二种特性

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

it168网站 ⋅ 2014/05/20 ⋅ 0

【产品分析】微信群聊为什么上限500人?达到1000人会有什么后果?

微信作为国民级应用,每一个功能点背后都值得产品思考。这一次,我们分析一下为什么微信的群聊是500人,而不是1000人或者更多,是基于什么考虑的。 之前跟朋友聊天,提到了这个问题:为什么微...

English0523 ⋅ 2017/12/04 ⋅ 0

论移动互联网测试还能活火多久

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

糖糖豆豆 ⋅ 2014/11/25 ⋅ 0

RSS 永生不灭

【编者按】本文作者为Swizec Teller | 本文是在看过《RSS之战》以及HackerNews上的一些激烈讨论之后有感而发,简而言之,RSS永生不灭。 RSS已死 在2009年的时候, Steve Gillmor 在Techcrunc...

红薯 ⋅ 2012/04/27 ⋅ 23

初涉Rx套餐 之RxBinding(让你的事件流程更清晰)

转载请注明出处:王亟亟的大牛之路 最近下班回家都在WOW,周末就爆肝,感觉人都要GO DIE了,昨天下午看了看RxBinding相关的功能感觉还是蛮强大的,所提供的API也是相当丰富(基本Rx套餐都是互...

ddwhan0123 ⋅ 2016/09/07 ⋅ 0

ReactNative&weex&&DeviceOne对比

  React Native出来有一段时间了,国内的weex和deviceone是近期发布的,我可以说从2011年就开始关注快速开发的跨平台平台技术了,接触过phoneGap、数字天堂、appcan等早期的移动中间件技术...

jonh_felix ⋅ 2016/07/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 38分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 46分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 47分钟前 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 52分钟前 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 今天 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部