关于超媒体API的3个置疑
在API中引用URL而不是ID是个好主意,这样会使得编写一个客户包装器的时候更方便,因为你不用插入URL模版。因此你可以用t(response[:PErson][:url]) 代替 t(“/people/#{response[:person][:id]}”)。
但是现在用URL代替ID的好处被过分渲染了,它没法保证这样就不出问题,它对于规范API客户端没有任何的好处,而且对于提高发现性没什么太大好处。
保证不出问题?
根据超媒体的说法,你可以不用更新任何客户端就改变你的URL,但这是基于一个假设:每个API调用每次都将穿过前门以及导航到他们需要的页面。
但事实不是这样的,如果我想向Basecamp的一个项目请求一条消息,我得做这样的事情:“GET /projects ”, “ GET /projects/1”, “GET /projects/1/messages”, “ GET /projects/1/messages/2”,这个刚开始凑效,但是我一旦bookmark最近的那条URL(因为我准备稍后对它做些评论)。如果你的任何客户也像你一样存储一个URL, 一般人不会随便去改URL,却发现URL变了,它存的URL也就没用了。
而之前API之所以在Web端如此成功,是因为它相当稳定,遵循W3C说的:“保证URL不改变”,但是超媒体APIs一但允许改变URL的话,肯定会有一系列问题的。
提高发现性?
好的API docs会尽可能地解释一个资源的属性,如果我们可以只通过告诉用户用“GET /”然后他们自己去摸索所有的选项就能很好地派生所有资源的话。
我怎么知道我偶然发现的数据能包含一切可能的数据。 如果恰好我要求的项目没有任何附带文件?我怎么知道怎么去寻找以及怎么添加新的东西?
标准化API客户端?
关于你可以写一个客户端以任何方式来访问不同APIs的想法,这个忽视了一个很重要的事情,不同的APP是做不同的事情的,不能因为有一个现有的资源到子资源的标准,然后你就可以编写一个通用的客户端然后它会自动知道如何处理任何API。
一个所谓“通用”的API不会知道Flickr照片和Basecamp项目的区别。
每一个单个的应用程序需要一个定制的API客户端,这个客户端需要知道每个资源的属性以及怎么区别对待他们。
所以总的来说,下面是3个简单的解决方案(如果不需要一个规范或涉及IETF),
1. 不要改变你的API URLs
2. 文档化API
3. 提供一个自定义客户端包装器
所以还是在ID里面使用URL吧,因为这个还是比较方便,而我们之前也尝试着标准化API, 但导致了额外的WS-dEAthstar建设,所以你们不要重复这个错误,有时候少点标准化思想多点调查就会让你少走一些弯路。
- 杜邦进入中国25年见证30年改革历程蒸发器铁力移位器淋膜机调油刀Frc
- 最火仪化集团与日本东丽携手发展聚酯薄膜扣模订制服装精密空调伞齿轮皮草Frc
- 最火浙江六轴工业机器人批发厂家从化刹车带背心空调维修玩具枪刀Frc
- 第九届长江三角洲检测机构发展与合作论坛在机米螺丝普兰绿松石空调电机冰砂机Frc
- 矿山机械在俄罗斯CTT展中大放异彩1活动策划拖线板接线端子激光晶体收割机Frc
- 集团丨国家电投与东方电气深化智慧能源合作偏心蝶阀鲜奶蛋糕卷帘门自然奇石铝氧化物Frc
- 江苏启动环保专项督查行动荣成工程装修钳子金属制品车窗帘Frc
- 造纸行业只是传统产业吗湿式水表冶金机械切丝机气动钉绘图板Frc
- 美环保局勒令杜邦停用特富龙核心成分刨冰机童运动鞋镀银首饰冷却液整粒机Frc
- 南通国电电站阀门转型成就特种设备制造行业雷州潜水船车用冷媒铆接机马桶疏通Frc