一个关于rest风格的讨论:只有经历过痛苦才知道人家为什么是对的!
我的同事最近老是抱怨我给的API非常的多,而且难以记住。
因为我的URL是这样的:
在传统的URL模式中,比如,我要参加某个活动,URL可能是POST:myapp.com.cn/1/api/12
然后,假如要获得参加计划的人的列表,URL可能是:POST:myapp.com.cn/1/api/13
这种方式显然不太妥。这是一个业务的增删改查,应该采用一个URL才可以。
我在写API的时候也遇到了这样的问题。一个增删改查会有好多的业务码。
实际上,应该使用GET方法来获取列表,使用POST来参加某个活动,使用DELETE来退出某个活动。
这才是REST风格。
真是只有经历过这些才知道人家为什么是对的啊!!!!!书本上的知识真的要去实践了,走走弯路,才知道什么是对的,什么是错的。就好像以前有人问我。数据验证是写在model层好还是controller层好。我告诉他,你每个都去试一下,自然就知道写在那个层比较好了。
但是现在我认为写在model层也并不是最好。直接分一个数据验证层才是好的。为什么?因为我实践过
回复内容:
我的同事最近老是抱怨我给的API非常的多,而且难以记住。
因为我的URL是这样的:
在传统的URL模式中,比如,我要参加某个活动,URL可能是POST:myapp.com.cn/1/api/12
然后,假如要获得参加计划的人的列表,URL可能是:POST:myapp.com.cn/1/api/13
这种方式显然不太妥。这是一个业务的增删改查,应该采用一个URL才可以。
我在写API的时候也遇到了这样的问题。一个增删改查会有好多的业务码。
实际上,应该使用GET方法来获取列表,使用POST来参加某个活动,使用DELETE来退出某个活动。
这才是REST风格。
真是只有经历过这些才知道人家为什么是对的啊!!!!!书本上的知识真的要去实践了,走走弯路,才知道什么是对的,什么是错的。就好像以前有人问我。数据验证是写在model层好还是controller层好。我告诉他,你每个都去试一下,自然就知道写在那个层比较好了。
但是现在我认为写在model层也并不是最好。直接分一个数据验证层才是好的。为什么?因为我实践过
看到有人没有正确理解表操作跟REST的关系,以下是我曾经在知乎回答过的一个问题,希望可以帮助理解
原题地址:http://www.zhihu.com/question/21662167/answer/18918959
楼主应该对REST有基本了解,所以基本概念我就不再重复,只说一下楼主比较糊涂的点
资源并不是对底层存储对象或者程序Model的直接映射
并不是说你有User表和Role表,就一定要设计对应的资源。
实际上RESTful资源和底层存储服务之间的关系类似于关系式数据库内的表和视图的关系,视图是根据实际查询需要组合多个表形成的关系集合。
无论你的存储服务到底是关系式数据库还是NoSQL数据库甚至文本文件,对于访问资源的客户端来说都是一样的。所以创建一个用户,同时设置其角色,完全可以用POST /user直接完成
// 创建具有foo和bar两个角色的新用户
POST /user
{name: (string), passwd: (string), roles: ['foo', 'bar']}
// 如果response header能够包含以下两条最好
// 以201状态响应,用Location告知新资源url
HTTP/1.1 201 Created
Location: /user/1// 修改用户的角色为foobar
PUT /user/1
{roles: ['foobar']}// 修改用户的密码
PUT /user/1
{passwd: (string)}至于/UserRoleRelation这样粒度比较小的资源,我建议先不要,资源的粒度应该是先粗后细,根据业务后续的演化和实际需要再考虑是否抽象更细粒度的资源,一开始就搞得太细的话,任何一次操作都会被分解为多次网络IO,且系统复杂度容易搞得比较高。
把具体的数据库表映射为资源,然后把CRUD动作对应到GET/POST/PUT/DELETE上,既傻又不安全,本来这些东西都是为业务服务,因为业务需求而存在的,结果抽象时却不围绕业务设计,这是本末倒置。
正确的思路应该是,忘记什么数据库和程序Model,只从HTTP的角度考虑,根据业务,需要设计哪些资源(url),GET/POST时接受和响应哪些参数,把这些敲定之后,再从数据库和程序Model上去考虑如何配合。
我更推荐学习一下 Github 和 Dropbox 的 API 设计,个人觉得比 Twitter 要好。
唔,不了解的话,不应该先看别人是怎么做的吗,看看有没有成熟的方案,这是twitter的api结构,可以学习下。
https://dev.twitter.com/rest/public
前几天翻译的 用 JSON 构建 API 的标准指南:中文版
感谢 @bornkiller 协助翻译。
不知道你原来对于REST的理解是来源于哪本书,但多看书,同时还得看好书。
REST架构的提出者在08年写了一篇文章痛斥人们普遍对REST理解不足。而REST(Representational State Transfer/表述性状态转移)并不仅仅是HTTP协议中GET/POST/DELETE/PUT 与 DataTable中Create Read Update Delete操作的映射。
而人们之所以把RESTful理解成对表的CRUD,则可能是受到了Rails中对REST支持的影响而产生了误解。按Roy Fielding的说法,RESTful必须是超文本驱动(使用超媒体作为应用状态的引擎),但按他老人家的定义,那90%标榜REST的API都不能说自己是RESTful的,因此Richardson对REST模型做了一个分级,大部分的RESTful API集中在一级成熟度上,而Fielding论文中所描述的REST设计则属于Web-aware,分级模型中的三级。
因此在这里提醒下楼主,不是随便一个类似domain/Res/ID就能说自己是RESTful的。既然要玩REST,至少得看一次原著者的首倡论文吧,哪怕看的一知半解也不会设计出你描述中开头那段API。
顶楼主,实践出真知啊,就冲这个,不赞都不行。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
