04 | 工整与自由的风格之争:SOAP和REST
04 | 工整与自由的风格之争:SOAP和REST
讲述:四火
时长21:07大小14.50M
概念
SOAP
REST
1. 协议
2. URL
3. 方法
4. 正文
风格之争
总结思考
选修课堂:动手调用 RESTful API
扩展阅读
赞 6
提建议
精选留言(14)
- 八哥置顶2019-09-18早期后台接口之间调用Web Service时用的SOAP协议多,比如订单和供应商之间接口调用等。后续RESTful风格更轻量级,开发者工程师更愿意使用。配合api文档,解决了联调过程中,接口没有定义规范等问题。 userName不是唯一的,实际无法完成删除,delete是一个删除操作,不应该暴露在URL里面。 应该是:/users/xxx。xxx是userId,然后请求的method设置为:DELETE。展开
作者回复: 感谢回答!回答正确。 第一个问题属于开放性的,当然,也有很多可供比较的其它方面。 对于删除用户的接口设计,回答得非常全面: (1)动作要以 HTTP 方法体现出来,而不是放在 URL 里面; (2)要使用 userId,而不是 name,userId 才是唯一的。 (3)资源使用复数“users”,完全正确。
17 - Gopher2019-09-20RESTful 风格的API:(系统接口:正交化,统一化/标准化,结构化) 1.正交化资源(名词)和动作(动词) 2.资源的描述要统一(URI),先模块/位置,再资源/标识符,最后可以附加简单的参数(?x="y"#label)。复杂的参数应当结构化,通过Header传递 3.动作要标准化(AEMR等有限集合),个性化需求可以通过API查询接口获取/协同 函数风格的API:(模块接口:正交化,结构化,模型化) 1.动词作为函数名,名词作为参数(正交化) 2.常见类型的参数(数量也不能太多)可以简单罗列,复杂的参数应当结构化为对象来传递,参数太复杂或数量太多时就需要考虑拆分函数(结构化) 3.函数存在于模块里面,它的目的是实现DSL(模型化),自然不能标准化。但它操作的对象相对单纯,因此函数语义(主要通过通过函数名称表达)相对更加明确,可以实现言简意赅展开
作者回复: 👍
共 2 条评论3 - leslie2019-09-18RESTFUL设计删除单个用户"http://xxx/deleteUser?userName=James"的问题如下:1)get/put/post/delete不是应当接完后再加/再去跟具体的么?至少应当改成"http://xxx/delete/userName/James" 2)其实这种具体的值不应当直接放到这里:我记得当年自己做开发的时候就不会允许暴露账号信息的 其实那里直接写到"http://xxx/delete/userName"样子就不会再在HTTP里面看到了;当年经典的SQL注入不就是全部明文写在里面了么。 REST架构和风格这块我在开课时曾说过希望能改善自己Coding的问题:按照老师REST那块的Coding演示:其实username=James应当放到Content-Type: application/json里面并且写出username:James;HTTP部分只到"http://xxx/delete/username"这样就OK了;翻阅了一些网站现在的写法,发现大多类似;具体答案:等待老师的揭晓。 谢谢老师的分享:期待下节课的内容。展开
作者回复: 感谢回答! 严格来说,行为应当放到 HTTP 方法中去,而不是 URL 中。还有使用 userName 本身的问题,你可以看一下另一位朋友的回答。当然,现在不少接口其实并不是很符合 REST 风格的,方法放在 URL 中就是其中一个方面。至于不允许暴露账号信息是特殊的业务需要,能想到这一点非常好,但它并非 REST 的要求。
4 - William Ning2019-09-26「,至于 HTTP,它是 REST 风格的重要载体。重要,但不是唯一,因为载体并不只有 HTTP 一个,比如还有 HTML 和 XML,」http与html xml这里适合放在一起类比吗?这里他们是阶段组合的关系,而非可相互取代的关系?若老师看到,望解答,谢谢
作者回复: 好问题。 我解释一下文中的含义:你理解得没错,它们是互相组合的关系,而非取代的关系。 进一步展开说,当载体体现的是它上面的数据的时候,就是 HTML、XML 或者 JSON 它们关心的了。我们在讲 REST 的时候,特别是设计 REST 风格的接口的时候,我们并不是到 HTTP 层面就戛然而止了,我们还会继续设计消息体,这就往往会提到这三者之一。
1 - 靠人品去赢2019-09-20(1)两种都用过,之前在银行类使用过webservice,就是很典型的,就是约定好字段一个不多一个不少按照WSDL上来。后面公司用的是Rest,看文档反正你要的我都给你了,需求变更也不怕反正能满足你就是了。 (2)参数选择不对,命名不规范,用户名称不是唯一的很可能重复,即使是唯一的,博大精深的汉字也能教育你,可能某个系统编码库不全,一些少见的字造成不必要的麻烦,什么飞龙在天的䶮可能结果是不一样的。还有接口命名,先是模块再是功能,如users/deleteUserById?id=XXX。看过一本书给的建议命名是不要怕长,总比看上去提示太少一脸懵逼强。 老师对命名有没有理解,之前没注意过现在虽然有意识的修改,争取见词知意,但还是有些没做好,像前一阵包名有大写字母和下划线被人吐槽看着蛋疼。展开
作者回复: 接口命名方面,没有统一的标准,但你可以看看第五讲扩展阅读的 AnyAPI,看看其他人是怎么做的,大多数接口服务的命名风格是一致的。
1 - 松松2019-09-18米用过,但如果米理解错的话,RESTful风格是用URI标识要操作的资源,用HTTP请求行为表示要对资源执行的动作,所以delete这个“行为”不应该出现在URI里吧,总不能get这个用户和del这个用户操作的还是不同的资源?
作者回复: 对,行为不能出现在 URI 里面,你可以看一下另一位朋友 的回答。
1 - Geek_7c49532020-11-24感觉rest很难描述资源之间的关系,就拿文中提到的图书馆来说,图书馆除了书还有书架,书架和书是一对多的关系。于是业务中有这么两项操作,将书上架到书架;将书下架。 由于书架明显是一个更“大”的资源,所以我认为描述这俩关系的时候,书架应该是owner,于是可以马上想到的两个接口设计分别是: PUT bookcases/1/books/1 DELETE bookcases/1/books/1 很好理解的两个接口,把1号书本上架到1号书架和把1号书架上的1号书本下架。 但实际上,这只是接口层面的表现,在逻辑层,下架数的时候只需要知道书本的ID就足够了,书架的ID是冗余的。而且,总不能为了接口层,让逻辑层还去检查书架的ID是否正确吧,比较按照REST来讲书架的ID如果错误的话,是要404的。展开
- 不要挑战自己的智商2020-08-07为什么rest URL都是名词?如果有动词有什么不好?
作者回复: 这是为了符合RESTful的规则。既然是资源,天然地,它就是名词。你可以针对某一个特定的资源实体做CRUD的操作,如果是一个动词,这就说不通了。
共 2 条评论 - leslee2019-11-17为什么删除操作是幂等性的...
作者回复: 在使用唯一的 id 去删除指定资源时,删除多次和删除一次效果一样
- William Ning2019-09-26关于幂等性,文中说的是服务端的数据状态不变,但是「从表格中你可以看到,创建资源单位不是幂等的,执行多次就意味着创建了多个资源单位,而其它操作都是幂等的。」这个是按照数据量来衡量的吗,如果是这样,那删除操作怎么是幂等的?望老师看到解答。
作者回复: 好问题。 我来解释一下文中的意思。“幂等”的效果是,执行了多次和执行一次的效果一样,而 REST 通常的删除设计都是基于唯一 id 的,因此从这个角度来说,删除多次,确实和删除一次是一样的,因为只有一次是完成了真正的删除。 但是创建就不是了,因为创建的时候,REST 的设计往往是不提供这个唯一 id 的(唯一 id 是服务端自动生成的),那么如果提交多次,就变成了创建了多个对象。
共 3 条评论 - OnFire2019-09-19目前外包在银行做供应链业务,soap与restful混用,新接口基本都不用soap了,像soap这种结构相对复杂的方案会逐渐被淘汰吧,restful更简单明了
- anginiit2019-09-19之前一个项目 ws和rest都有用到,rest是自己项目前后台请求使用,ws是请求第三方的接口使用。只是停留在使用阶段 还没有深入的了解过,借着这一课 认真学习下。
- 许童童2019-09-18项目中用的基本上都是REST,我觉得用SOAP的只有以前遗留下来的代码了。
作者回复: SOAP 还是常有使用的,特别是一些电信软件、传统软件等领域。当然,确实 REST 更常见。
- sky2019-09-18项目中基本上用的都是restful。soap用着别扭
作者回复: 为什么别扭?:)
共 2 条评论