版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://phoenixtoday.blogbus.com/logs/45855234.html

最近小组里有一些关于REST API设计的讨论,有些收获,打算在这里写一下。通常来讲设计第一个版本的REST API并不难,难点在于将来你要改变了这些API,而客户那里已经有对应的客户端实现, 那么你怎么保证兼容?或者,至少,你应当让这些东西失效吧,这样客户才能知道。所以基本上就是两个问题。

1,在最初设计时,如何尽量保证向后兼容?(这里不提倡过度设计噢,我们是搞敏捷的,哈哈)

2,如果API发生了改变,该怎么通知已有实现?

对于第一个问题,答案相对而言简单一些:支持必要的,但是最少的东西,而且层次不要太多。为什么?用下面的xml,举个例子来说

<person>

<name>phoenix</name>

<job>softerware developer</job>

<company>ThoughtWorks</company>

</person>

第一层,指的是这个xml具体针对什么,第二层有三个属性,分别是name,job和company,这是一个嵌套层次很好的,而且也没有包含过多的信息。但是如果我们在一开始再加上address属性(假设它并非必要),那么如果客户构建了一个客户端也的确包含了address属性,那么在下一个版本的API中,你把这个属性去掉了。问题是不是出现了?客户的软件无法工作了。反过来,如果最开始的版本不包含address,但是有客户强烈要求下一个版本要支持,那么怎么办?简单!在下一个版本加上就好了,对于已有的客户端,多一行冗余数据而已,也不会导致客户的软件无法工作。好了,这个问题解决了,那么,什么是嵌套层次不要太多。举个反例

<person>

<name>phoenix</name>

<job>softerware developer</job>

<company>

<name>ThoughtWorks</name>

<locations type="array">

<city>beijing</city>

<city>san francisco</city>

</locations>

<products>

<product>

<name>mingle</name>

</product>

<product>

<name>cruise</name>

</product>

<product>

<name>twist</name>

</product>

</products>

</company>

</person>

这叫层次太多!一个company里,包含了太多的嵌套信息,其中location还算说的过去(因为只是一个简单的数组),但是products里包含了子对象就不对了,这就是第三层对象了,具体的解决方案可以利用url来替换掉。世界终于清静啦!

可是我还不能清静,因为要回答第二个问题:API改变了,该怎么通知已有实现?这是一个很头疼的问题,如果能避免回答我绝对会避免,可惜,不能!通常有两种解决方案,但目的都是为了让客户的软件失效(我知道,我知道,这会让客户抓狂,可是我们也没辙啊!所以还是能不动,则不动,打死也不动,打不死嘛......就按如下办)a,使用带有版本号的API URL(这是现在最经常使用的一种方法),例如api/v2/projects/members.xml前面的api不说也明白,v2就是version 2版本2的意思,如果更换了,就变v3,客户的软件不能用了,也就知道了;b,利用HTTP header 里的ACCEPT来解决(别说你写了这么多年程序,连HTTP有HEAD都不知道啊!会被鄙视的!),ACCEPT可以设置接受的文件,你可以将版本信息放在里面。技术细节不多说了,给个链接,供大家参考 http://barelyenough.org/blog/2008/05/versioning-rest-web-services/ 其实我是比较赞成这种方式的,比较优雅,但缺点就是它还不是标准,对方的程序员也可能不知道HTTP有HEAD,所以做起来,对人家可能会有点复杂,这里就不再多说了。

总之昵~~,小初(想必盯我博客很久的人,也都知道我姓甚名谁了,以后我就用真名了)的技术博客在沉寂了,这么久之后,又回来了(我胡XX又回来啦!哈哈),有太多东西要写了,以后会陆续带给大家的,多谢捧场!

PS:为啥Blogbus不支持<pre>标签呢,让我的xml这么丑的出现在博客里?惭愧呀!

转载于:https://www.cnblogs.com/hnrainll/archive/2011/08/16/2140445.html

关于REST API设计的一些小经验相关推荐

  1. 百度地图API二次开发小经验分享

    最近在做一个物流后台系统,需要用地图来把订单地址展示出来,需要在地图上批量框选坐标进行排单,需要看到配送员的实时位置等等功能. 在高德地图.腾讯地图.百度地图三者间,我选了百度地图,没有原因,个人偏好 ...

  2. 转载 百度地图API二次开发小经验分享

    转载From:http://www.cnblogs.com/yiyiBlog/p/5122224.html 最近在做一个物流后台系统,需要用地图来把订单地址展示出来,需要在地图上批量框选坐标进行排单, ...

  3. RESTful API设计技巧经验总结

    原文:RESTful API Design Tips from Experience 作者:Peter Boyer 翻译:雁惊寒 译者注:本文是作者在自己的工作经验中总结出来的RESTful API设 ...

  4. 微服务API设计的实践与思考总结

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取后台回复"k8s",可领取k8s资料 随着微服务的越来越 ...

  5. [译] RESTful API 设计最佳实践

    https://juejin.im/entry/6844903503953920007 [译] RESTful API 设计最佳实践 阅读 8779 收藏 0 2017-10-16 原文链接: seg ...

  6. 什么是好的API设计? 1

    摘要:有人言,API设计是编程工作中最难的事情.甚至有人认为至少要有10年的工作经验才能接触它.不过这里提出了一个引人思考的问题:究竟是构建什么样的库需要花费10年的时间去学习? 有人言,API设计是 ...

  7. C++ API 设计 06 第一章 简介

    第一章 简介 1.1 应用程序编程接口是什么? 应用程序编程接口(API)提供对问题的一个抽象,并说明客户端如何与实现这个问题的解决方案的软件组件来进行交互. 这些组件本身通常作为一个软件库发布,允许 ...

  8. C++ API 设计 07 第二章

    第二章 品质 本章的目标是回答下面的问题:一个良好的API需要什么样的品质?大多数开发人员都同意,一个良好的API应该设计得很优雅,而且仍然非常容易使用.它应该在后台运行且使用起来让你觉得很惬意.这些 ...

  9. C++ API 设计 09 第四章 设计

    第四章 设计 上个章节是为开始设计API打下基础和准备必要的开发背景知识.我分析了各种对API设计有益的品质和讲解了应用于可维护的API设计的标准设计模式. 本章将把这些信息全部整合到一起,涵盖高品质 ...

最新文章

  1. Android开发中的多线程编程技术
  2. 使用撤回流RetractStream的场景
  3. python中汉字与变量不可同时出现_Python语言应用培训课(选择练习)
  4. python bool值要注意的一些地方
  5. android封装oauth2,Android AccountAuthenticator和OAuth2
  6. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
  7. 重磅!滴滴全员会宣布过冬:将裁员15% 涉及员工超2000人
  8. 开发技巧汇总|对于imag.js你不知道的事
  9. opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】点集拟合
  10. POJ3069 Saruman's Army【贪心】
  11. 传说中的Markov不过如此”
  12. 机器视觉运动控制一体机应用例程|U盘视觉定位激光打标解决方案
  13. python入门(三) 实现QQ自动发送消息
  14. 微波工程学习1-电磁理论
  15. 全网视频下载器网页版-AllTubeDownload
  16. 京东商家下单未付款?订单催付教程
  17. 观察者(observer)模式(一)
  18. mysql忘记密码怎么处理
  19. 用户信息管理的功能开发
  20. Bonjour(苹果电脑公司的服务器搜索协议商标名)

热门文章

  1. Lucene创建索引入门案例
  2. About 磁珠(Bead)
  3. PHP-ExcelReader
  4. Eigen密集矩阵求解 1 - 线性代数及矩阵分解
  5. 机器学习线性回归学习心得_机器学习中的线性回归
  6. mysql 序号_脚本搭建Nginx、Redis、MySql、Maven
  7. 谷歌fuchsiaos和华为鸿蒙,华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓...
  8. jenkins 插件目录_三十二张图告诉你如何用Jenkins构建SpringBoot
  9. python 主要内容,介绍一些有关python的重要内容
  10. c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...