说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

别再设计易碎的Web API!

HTML文档下载 WORD文档下载 PDF文档下载
不要再设计易碎的Web API了,否则你的合作伙伴或第三方开发者会因此恨你,而离你远去的。想设计出相对稳定牢固的API,关键在于以应用目的为中心来做设计。

原文作者Mathieu Fenniak在博文中大呼:不要再设计易碎的Web API 了,否则你的合作伙伴或第三方开发者会因此恨你,而离你远去的。他认为,想设计出相对稳定、牢固的API,关键在于以应用目的为中心。文中还分享了设计优秀API需要注意的几点事项,我们一起来看下:

如果破坏了API,客户会因此而恨你

很多Web API发布后,它就像被牢牢刻在石头上无法做出兼容改变,这是个可怕的现象。倘若你破坏了API,你的客户会因此而恨你,紧接着就是你的老板。因此,你必须对该API进行更新、维护。

如果API设计的很好,那么它不会这么脆弱

减少其脆弱性或增加其韧性是管理API设计的方式之一,其关键在于以应用目的为中心做设计。也就是SOA领域,所谓的面向业务(business-orientation)。也许这个概念很难理解,下面的这个示例能很好的说明这一点:

URL之间的区别是什么呢?

http://api.fbi.gov/wanted?  order_by=notoriety,desc&  limit=10&  page=1&  fields=name,aka,known_associates,  reward,description,last_seen

这是一份来自美国联邦调查局的列表。该API包含了许多功能:你可以预定任何领域,按照升序或者降序进行排列;可以指定结果计数 ;可按页查询并且还根据指定详细信息进行检索。

对比看下这个URL:

http://api.fbi.gov/wanted/most

两个URL虽然有着相同的目标,但是执行方式不一样。第一个是名程序员设计的,他能提供任何你想要的功能。设计中没有描述用户的意图,但却利用请求定义详细信息来替代。

第二个URL意图则非常明显,显示联邦调查局头号通缉犯名单,模糊的细节,这是根据意图来进行设计的。

根据”意图“设计API,减少其脆弱性,有哪些优势呢?

  1. 易使用——没有复杂的程序、复杂的细节,易于学习;
  2. 灵活性——意向驱动API可随着服务器端的变化而变化;
  3. 一致性——一致性是API设计必备的一大特性;
  4. 松耦合——这是向后兼容性问题。你只需返回一个固定的值,后端兼容在意向驱动API中会运行的很好;
  5. 可优化——当对数据库进行更新时,可计算优化而不是在内置的需求上,这比优化每个组合的程序设计要困难得多;
  6. 可缓存——易缓存。程序员的设计使得缓存困难(正常可查询参数)和无效(比如限制=5 / 10 / 15缓存未被命中);
  7. 易开发—— 由于高复杂性使得开发和测试测试程序员的API变得更加困难和耗时。
  8. 高效验证模型缓存 — — 快速检查If-None-Match/If-Modified-Since HTTP标头并作出"304 Not Modified"响应。

但是,我需要一个更加通用的API设计……

为什么需要通用的API设计?这是因为意向会让你设计出更好的API。比如,API的灵活性。灵活的API非常有助于于开发用户界面,允许按字段排序、可自定义分页、排序和筛选或搜索。

此外,铭记UI意图,还可以提供一个易于使用、开发、灵活、一致、松耦合、可优化、可缓存和高效的API的设计决策。

DRY原则(Don’t repeat yourself)

在执行过程中不要使用重复原则,但在API设计中无须担心重复设计。如果你提供了多个API端点可根据不同意向来检索相似的对象,从常见的代码路径开始吧。 为用户提供更多具体的服务,你需要不断对API进行维护。

这个真的适用于现实的API领域吗?

这是GitHub提交的一份Status API示例,通过持续集成服务来标记存储库版本。
  1. 定义特定的功能:指定一个国家修订的版本库
  2. GitHub会自动将请求相关联的,显示在一起
  3. 无HTML 或可自定义的国家;API 有极少数量的数据需求。
  4. 面向未来:它以简约的方式满足定义的问题。
  5. 状态相关修订;提交添加更多的请求工作。
  6. GitHub 具有灵活性,可以进行更改,而不会破坏兼容性:1. 对于API,GitHub暂不支持重写功能整个请求功能;2.可适用于其他UI领域;3. 如果 GitHub变成MercurialHub、SubversionHub、PerforceHub、 CvsHub、RcsHub,API可同样被应用。
  7. GitHub灵活显示提交状态: 可在移动应用中显示状态、本地化的文本易合并。

还有个真实的例子 Twilio’s AvailablePhoneNumbers API,目的是为了搜索电话号码分配到您的账户中,这个看起来就像典型的API集合,但是细节和意图关联并不大。

总结:

综上所述,不再设计脆弱的Web API,我们得出几点:1.根据自己的意向设计API;2. 在细节上是模糊的;3.提供多个API以区分用户意向;4. 通过分享常见的实现方式而不是提供一个通用的服务来减少代码重复。

CSDN各位网友,对此,您怎么看呢?

英文出自:Mathieu.Fenniak

html()-JQuery API removeAttr(name)-JQuery API removeClass(class)-JQuery API text(val)-JQuery API text()-JQuery API toggleClass(class)-JQuery API val(val)-JQuery API val-JQuery API after(content) -JQuery API append(content) -JQuery API appendTo(expr) -JQuery API before(content)-JQuery API clone(deep) -JQuery API empty()-JQuery API insertAfter(expr)-JQuery API insertBefore(expr) -JQuery API prepend(content)-JQuery API prependTo(expr)-JQuery API remove(expr)-JQuery API wrap(elem)-JQuery API wrap(html) -JQuery API add(elements) -JQuery API add(html)-JQuery API add(expr) -JQuery API children(expr) -JQuery API contains(str) -JQuery API end() -JQuery API filter(filter) -JQuery API filter(expression) -JQuery API find(expr) -JQuery API is(expr) -JQuery API 万分感谢!!!!! borland 会不会出一个 C# Builder? 乱码,头大了,不知道为什么pb导入excel怎么办 数据统计问题,请大侠门帮忙!急急急!!! 求解ZModem通讯协议源程序----有谁用过CZModemCore 我也不知道对不对! 最高级的问题?搞一个专业的VC程序员基地~~~~~~ 在研究directshow filter的push模式的兄弟请进 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了 有两个问题,每题40分,马上给分!!!! 如何使用打印机? 在爱情方面谁能做到这一点? 谁有 file cutter v1.4的注册码? 有急用! 搞一个专业的VC程序员基地~~~~~~谁愿意加入????? 最新发现:原来C++Bilder的项目文件(.bpr)是XML格式的! 关于FAT32和NTSF的问题 如何用VC实现Email的发送? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了! 搞一个专业的VC程序员基地~~~~~~需要网页制作高手!! ADO 的用法 m_pRecordset->Fields->GetItem(index)->GetName() 关于CRichEditCtrl的问题之二,取的当前可见行数? 请问在哪里下载IMAIL SERVER???各位帮帮忙!!! 高手请回答,ADO和BDE到底有什么区别,你选择谁?为什么? 高分求教!!!!!!!!!!!!!!!!怎样得到局域网上所有的机器名?(普通WINDOWS网络,用VB?,好象用WNET API可以的) 如何安装com.ibm.bridge2java.*这个包阿? 有人吗???求救! 你也许也会遇到这样的问题? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!!! 大虾看过来. 一个access表一万条记录,想转到Mysql下(Mysql在Linux下)用什么方法和什么语言来做好? rs.CursorLocation=aduseclient是什么东西? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题! 简单SQL,免费送分! 用ASP如何上传文件,可以用组件。 谁知道怎么改运行中的程序的托盘图标???我用SysTray.ocx不能改? 新手提问,简单题目,大量给分~~~~~~~~~~ 如何使用getdispatch(), 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!! 关于在一个窗口中的多个数据窗口的问题 扔块砖头, 开个场子 。 ( yeti_lee ) 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了? To: baicolt(五岁的小新是我师傅) 有没有人用过Jcreator 如何在sql server 的查询分析器中用sql语句转到另一台机器上的数据库,同样了sql server的 是不是MSHFlexGrid的bug? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了?? 这个错误类型是什么意思? 如何能够简单的得到昨天的日期? NetBios-SSN是什么? 怎样得到局屿网上所有的计算机名,我想给班里写个局屿网聊天程序,原想用DX8,但DX8好想建立的连接都是C/S模式的。如果能得到机器名就可以用WINSOCK写了(用VB写) 请问诸位有没有什么自动生成源码注释的工具,可以产生函数说明注释和类说明注释 6吨等于多少克 在比例尺是1:5000000的地图,上量的甲、乙两地的图上距离是6厘米,把它画在比例尺是1:3000000的地图上,应画多少厘米 1kg棉花和1kg铁块相比谁的密度大?杀人砂仁提问 一根绳子第一次用了全长的1/4,又用了5/2米,这时已用的/剩下的=2/3,绳子长多少米 1根绳子,用去5米后,剩下的长度是用去的百分之八10,这根绳子原长多少米? 1T棉花和1T铁块比较,以下说法正确的是A.棉花体积较大,所含物质较多 B.铁块掂着较重,所含物质较多 C.棉花和铁块质量相等,所含物质一样多 一根绳子第一次用去全长的1/5,第2次用去3/5米,两次共用去这根绳子的1/2.这根绳子长多少米? 在1:5000000的地图上,量得甲,乙两地的图上距离是6厘米,把它画在比例尺是1:3000000的地图上 应画多少 1kg的棉花和1kg的铁块相比,下列说法正确的是A.棉花所含物质较多 B.棉花和铁块所含物质一样多C.铁块所含物质较多 D.不是同一种物质,无法比较 上海到杭州的实际距离大约是150千米,在一副比例尺是1:3000000的地图上,两地之间的距离是多少厘米?随便帮我把答案算出 在1:5000000的地图上,量得甲、乙两地的图上距离是6cm,把它画在比例尺是1:3000000的地图上,应画多少厘米? 数学二进制、八进制、十进制、十六进制之间如何转换?这几种数值之是转换是以什么为依据的?怎样转换更方便、简单、快捷?转换关系是什么?(本人急用,请走过、路过的朋友帮帮忙忙吧.本 在一幅比例尺为1:3000000的地图上量得上海到杭州的距离为5cm,把它改画在比例尺为1:5000000的地图上,上海到杭州的图上距离是多少厘米?(如果不会,不妨用方程试试!) 小学换算公式0.4千米=( )米1200米=( )千米284克=( )千克532厘米=( )米1480米=( )千米1.5千米=( )米1670米=( )分米1.48千米=( )米 谁能帮我讲解一下数学里的十进制,二进制?我学计算机的,因为要涉及到这方面的问题,我不懂,所以请谁帮我讲解一下,谢``` 在一幅比例尺是1比5000000的地图上,量的上海到杭州的距离是3.4厘米.上海到杭州的实际距离是多少? 一根绳子长8/7米,截5次后,剩1/8米,平均每次截几米. 十进制和二进制的数学问题二进制中1101等于十进制的数是? 在一幅比例尺是1:5000000的地图上,量得上海到杭州的距离是3.4cm.上海到杭州的实际距离是多少 60秒等于多少小时? 在比例尺是1:3000000的地图上,量得两地的距离是10厘米,甲乙两车同时从两地相向而行,3小时后相遇.已知甲乙两车的速度比是2:3,求两车的速度各是多少千米? 在一幅比例尺为1:3000000的地图上量得上海到杭州的距离为5cm,把它改画在比例尺为1:500000的地图上 60小时等于多少秒. 在比例尺是1比3000000的地图上,量的A、B两地距离是10厘米,甲、乙两车同时从两地相地相向而行,3小时后两车相遇.已知甲、乙两车速度比是2比3,求甲、乙两车的速度. 700米 800米等于多少吨? 12亿秒等于多少小时?或等于多少天? 在比例尺是1比3000000的地图上,量的A,b两地的距离是15厘米.甲、乙两车分别从A,B两地同时出发,相向而行,3小时后相遇.已知甲、乙两车的速度比是2比3,求甲、乙的速度 15米长的绳子,用去五分之二,还剩()米?一根绳子,用去五分之三米,还剩12米,这个绳子()米?一根绳子,用去四分之三,正好用去15米,还剩()米? 35亿秒等于多少小时 要说清楚 我除了也是97。但是这么多个小时 郁闷 要玩到什么时候 郁闷 那又是多少天呀 在比例尺是1比3000000的地图上,量得两地相距10厘米,甲,乙两车同时从两地相向而行在比例尺是1比3000000的地图上,量得两地相距10厘米,甲、乙两车同时从两地相向而行,3小时候两车相遇,已知甲乙 在一幅比例尺是1:8000000的地图上.量得A、B两地之间的距离是3厘米.A、B两地间的实际距离是().A.80千米 B.2400千米 C.240千米 一根绳子的长度等于它本身长度的四分之三加上四分之一.这根绳子长多少? 什么时候一吨棉花比一吨铁重一些? 一幅地图上的比例尺是1:2000000,把它改写成线段比例尺是( ),在这幅地图上量得A、B两地的距离是15厘米一幅地图上的比例尺是1:2000000,把它改写成线段比例尺是( ),在这幅地图 一根绳子的长度等于它的本身的四分之三加上四分之三米.这根绳子长多少米? 关于一道数学虚数方程题RT,因为因式分解什么的都没弄出来=-=忘记打题目了=-=x^3-6x^2+10x-8=0 一根绳子,先用去40米,有用去余下长度的五分之二,这时余下的绳子正好是原来总长度的三分之一.这根绳子原来长多少米?(不要用两边都有X的方程) 有一堆沙子,第一次运走五分之一,第二次运走剩下的五分之二,问那一次运走的多,为什么?(列算式) 什么是纯虚数 ?谢谢了,大神帮忙啊 在比例尺是1:3000000的地图上,量得两地的距离是6cm.甲、两辆汽车同时相向开出,4小时后相遇.已知甲、乙两车的速度比为4:5,求甲、乙两车每小时各行多少千米? 一堆沙第一次运走了四分之一,第二次运走了五分之二,还剩下14吨,这顿沙原来有多 在比例尺为6000000分之1的地图是量得甲、乙两地间的铁路线、长约5厘米.有快、慢两车同时从甲、乙两地相对同时从甲、乙两地相对开出,3小时后相遇.已知快车每小时行65千米,慢车每小时行多 在一幅地图上,比例尺为1:300000,量得A、B两地的距离为18厘米,则A、B两地的实际距离()千米 数学换成乘积的形式谢谢(4) 有没有数学过关的教教转换公式.46.94%含固量的液体是43.87吨,换算成36%含固量的液体是57.20吨.其中46.94%含量的液体价格是每吨2440元一吨.那么.转换成36%含量的液体是多少钱. 1十1等于多少 数学换成乘积的形式谢谢(2) 在产品销售成本计算表中单位成本是如何算出来的,有计算公式吗在产品销售成本计算表中单位成本是如何算出来的,产品入库单是怎么得来的,没有产品购买来呀,只有购材料 请问:工作压力:10Kg/cm2 (十千克每平方厘米)等于多少KPa怎么换算的 求超大数字乘积 表达式意义2017612633061982200*18446744073709552000=?上面数字乘积等于多少,3.7218383881977644e+37;这个数字表示什么意思 我要求的数字是10的2017612633061982200*18446744073709552000 次方也就是1 货物加运费以后如何计算成本?有没有计算公式,谢谢单一一种东西我会算,例如:10件物品350元,加运费20元,一共370元,那么1件物品成本为37元,我实在你不明白多种不同价格东西如何摊运费呢?例 0.02kg/cm2等于多少kpa?最好说明详细计算方法, 1亿除以60等于多少?拜托 1.在比例尺是1:3000000的地图上,量得A、B两地的距离是50厘米.甲乙两辆客车同时从A、B两地相对开出,经过10小时相遇.甲客车每小时行76千米,那么乙客车每小时行多少千米? 1kg/cm2等于多少kpa/0.01mm 在一副比例尺为1:3000000的地图上,量得A、B两地之间的距离是4.5厘米.再另一副比例尺为1/5000000的地图上,A、B两地的图上距离是多少? 把一亿化作以万作单位是怎么换算的 压力单位50psi等于多少kg/cm2 还等于多少kpa 在比例尺为1:3000000的地图上,图上1厘米表示实际距离多少千米?在1:3000000这个比例尺中所表示的实际距离是图上距离的多少倍? 一道换算单位30000cm^3=( )kg?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn