聚集网(jujiwang.com) - 收录免费分类目录信息软文发布网址提交
免费加入

接口的最佳实践和常见陷阱 (接口的最佳实验方法)

文章编号:11218时间:2024-09-30人气:


接口的最佳实验方法

引言

接口是软件设计中至关重要的概念,它们允许对象之间进行松散耦合,提高代码的可重用性、可维护性和可扩展性。在设计和使用接口时,需要注意一些最佳实践和常见陷阱。

最佳实践

1. 保持接口简洁

接口应该只定义必要的操作,避免包含不必要的细节。这有助于保持接口的清晰性和可理解性,并防止耦合过度。

2. 使用清晰的命名约定

接口和方法的名称应该清楚地描述它们的用途。避免使用模糊或通用的术语,因为这可能会导致混淆。

3. 定义明确的契约

接口应该清晰地定义客户端和实现之间期望的契约。这包括返回类型、参数类型和异常处理行为。

4. 避免循环依赖

接口不应该引用它们实现的类,因为这会导致循环依赖,使得代码难以维护。

5. 使用标准接口(如果可用)

在设计接口时,如果已经存在标准的、广为人知的接口,则优先使用它们。这有助于确保代码与其他系统和库的一致性和互操作性。

常见陷阱

1. 接口过于宽泛

过于宽泛的接口可以引入不必要的耦合,并使代码难以理解。在设计接口时,应尽可能具体,只包含必要的细节。

2. 接口过于狭窄

过于狭窄的接口会限制可重用性,并导致代码重复。在设计接口时,应考虑接口的未来可扩展性和不同场景下的使用情况。

3. 接口膨胀

随着时间的推移,接口可能会变得膨胀,包含越来越多的方法。这会降低接口的可理解性和可维护性。应定期审查和重构接口,以移除不必要的或过时的操作。

4. 接口继承过多

接口继承过多会增加接口的复杂性和耦合度。在继承接口时,应仔细考虑继承的关系,并确保它不会导致不必要的耦合或冲突。

5. 不适当的使用默认实现

在使用 Java 8 中引入的默认实现时,应谨慎。默认实现可以方便快速地实现接口,但如果使用不当,可能会导致难以理解和意外的行为。

结论

接口是促进代码重用、可维护性和可扩展性的强大工具。通过遵循最佳实践并避免常见陷阱,我们可以设计出清晰、简洁且可重用的接口,从而提升软件的设计质量。


求推荐JAVA入门书籍

1,《Head First Java》java入门书籍《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。 此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。 最重要的,你会学会如何像个面向对象开发者一样去思考。 《HeadFirstJava(中文版)(第2版)(涵盖Java5.0)》的图文并茂学习方式能让你快速地在脑海中掌握住知识。 敞开心胸准备好学习这些关键性的主题:Java程序语言;面向对象程序开发;Swing图形化接口;使用JavaAPI函数库;编写、测试与部署应用程序;处理异常;多线程;网络程序设计;集合与泛型。 如果你想要看一本正经的书,去找其他的。 如果你真地想要好好地学习Java,你会需要《Head First Java》。 这本书可是Amazon编辑推荐的十大好书之一!强烈推荐学习此书,非常适合初学者入门。 2《Java从入门到精通》适合自学者《Java从入门到精通》这本书主要针对java基础,对于没有学过java的人才说,是一个不错的选择。 通过这本书,大家可以从零开始,慢慢来学习,而且实操很多,不会让你看到最后出现只会理论的情况。 为什么说培训的人不用看呢?因为这本书上的内容和许多培训机构的书籍有很多重复的地方,所以参加培训的同学就可以不看了。 如果觉得自学太难太慢的话,那就报培训机构吧.3.《Thinking in java》(中文名:《Java编程思想》)适合中级自学者和培训者《Java编程思想》可以说是最经典的java著作,是所有java程序员必备教科书。 这本书不管是正在学习还是已经工作许多年的程序员,都可以从这本书中得到你想要的东西。 这本书具有教材和工具书的作用,就像一本字典,想知道什么都可以从中查询。 虽然这本书很好,但并不建议初学者学习,对于初学者难度较大。 4.《疯狂Java讲义》适合自学者看《疯狂的讲义》这本书比较适合自学者,内容比较项目化,实操方法很多,如果你想进行java的深入学习,不妨看看这本书。 《疯狂Java讲义(第5版)》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制。 覆盖了、、、和、、、包下绝大部分类和接口。 本书重点介绍了Java的模块化系统,还详细介绍了Java 10、Java 11的使用var声明局部变量、在Lambda表达式中使用var声明变量、改进的javac命令、基于嵌套的访问控制、HTTP Client网络编程,以及Java 10、Java 11新增的各种API功能。 5.《Java核心技术》最适合报培训班的看这本书分为两个部分,第一个部分讲的是基础知识,第二个部分讲的是高级特性。 由于内容非常有层次,所以非常适合自学和上培训机构的同学学习。 尤其对参加培训的同学作用较大,因为一般培训机构讲的非常快,有很多东西没办法及时消化吸收,很多基础和核心的东西就会掌握的不牢固,那么这本书正好弥补了这个缺失。 6.《Java开发实战经典》适合自学者看该书是一本综合讲解Java核心技术的书籍,在书中使用大量的代码及案例进行知识点的分析与运用,并且给出一些比较成熟的开发步骤,帮助读者更好地进行Java的开发。 从作者多年的Java培训经验来看,大部分学生对各种高端开发都没有任何问题,唯一的问题在于Java基础并不牢固,而且在国内也始终没有一本真正可以引领读者入门的好书籍,大部分的书籍都是围绕概念本身进行讲解的,没有讲解清楚为什么要具备这些知识以及该如何去理解这些知识。 本书真正地做到了让每一位读者都能清楚地知道每个知识点的来龙去脉,不仅可以很容易地看懂一个程序,而且能真正地灵活运用程序,编写代码。 在学习编程语言时,环境、代码调试等,都是很多读者最头疼的地方,而且很多代码都会存在一些细节上的问题,所以,本书为了让读者可以更好地理解每一个知识点,将书中所有内容都录制成了视频,让每一位读者真正做到轻松学Java、从零开始学Java,以优质的视频教学为每一位读者提供最大的支持。 这本书比较适合自学者学习,里面有很多小案例,可以边学边练,巩固知识。

【干货】常见流量仪表选型原则和方法

流量世界的复杂性,选型的艺术

流量,如同流动的旋律,其测量涉及到多种因素,包括管道的尺寸与形状(圆形或矩形),介质的特性(如温度、压力、密度、粘度等),流体的流动状态(如湍流、速度分布),以及安装环境的苛刻要求。 面对世界范围内琳琅满目的流量仪表种类,如容积式、差压式、涡轮式等,如何在繁多的选择中,根据实际需求科学选型,至关重要。 本文将深入解析流量仪表选型的策略,帮助您解锁流量控制的智慧。

选型原则的五重奏

成功选型,首先要求对流量计的原理和流体特性有深入理解。从五个关键方面来考量,让每一步都精准无误:

流量与上限流量的考量

上限流量,即流量计的最大流量,是选择口径的重要依据。 选择流量计时,要考虑到管道的经济流速,如水1.5-3m/s,油品0.2-1m/s。 不同类型的流量计,如玻璃浮子流量计上限流速低,而涡街流量计则较高。 同时,要防止过高的流速导致的气穴问题,确保流量计的最小背压设置。

安装的艺术与陷阱

流量计的安装细节不容忽视,例如差压式流量计需要直管段,而容积式流量计则无需。 错误安装如孔板反装,流速分布不佳,引压管污染,恶劣环境下的安装,或流量计置于电磁干扰区域,都可能导致测量误差。 因此,遵循专业指导,确保每一步安装都遵循最佳实践。

总结来说,流量仪表选型是一场精密的工程,需要深思熟虑各种因素,才能确保测量的准确性和系统的可靠性。 通过科学的选型,您将能更好地驾驭流量的世界,提升生产效率和控制精度。

什么是好的API与设计流程和设计原则

安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。 那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。 HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。 那么,您认为一个好的RESTful API应该具有哪些特征呢? 李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 浏览器是最常见和最通用的REST客户端。 好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。 这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。 Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。 RESTful API建模的过程与面向对象建模类似,是以名词为核心的。 这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。 而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。 对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。 所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。 将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。 设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。 这个API应该是松耦合的。 RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。 正是这三个层次确保了RESTful API的松耦合性。 当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。 紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。 尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。 REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。 感兴趣的读者可以参考《REST实战》。 这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。 资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。 GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。 这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。 所以除非有很合理的要求,通常不需要使用自定义的私有格式。 使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。 响应状态代码分成两部分:status code和reason phase。 两部分都是可定制的,也可以使用标准的status code,只定制reason phase。 如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。 这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。 HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。 而在整个HTTP通信链条的很多位置,都可以设置缓存。 HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。 如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。 李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。 我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。 比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。 HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。 再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。 而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。 丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。 马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。 包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。 但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。 提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。 InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。 那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。 要求接入方的请求中必须加上签名参数。 这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。 其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。 使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。 HTTP Digest身份认证可以单独使用,具备中等程度的安全性。 HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。 不过插入自定义加密算法在面向互联网的API中用的不是很多。 这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。 优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。 在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。 HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。 缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。 使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。 其中的加密机制与HTTP Digest身份认证相比,安全性更高。 需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。 OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。 如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。 对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。 仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。 身份认证之后的授权,主要是由应用来控制。 通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。 李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。 当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。 但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。 至于WS-族的协议,我不太了解,不太能参与讨论。 丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。 例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。 在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。 如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。 马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。 InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。 另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。 不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。 李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。 丁雪丰:个人认为最好的版本化,就是没有明显的版本。 在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。 例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。 如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。 也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。 马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。 另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 或者 /v1/ 这样。 InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。 如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。 CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。 HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。 我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。 如果在资源上定义的操作过多,我们会选择拆分出更多的资源。 李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。 但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。 另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。 基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。 丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。 其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。 如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。 马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。 InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。 我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。 b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。 c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。 这三部分的内容对于开发者来说都很有用。 遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。 李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。 InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。 李锟:这个问题我就不详细回答了。 不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。 开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。 保持多样性是繁荣生态环境的基础。 像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。 这些框架目前都做的不错。 我对框架的选择没有倾向性。 RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。 李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。 REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。 当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。 另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。 丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。 如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。 如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。 REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。 马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。 轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。 InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。 HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。 兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。 改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。 更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。 应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。 废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。 增加更多的动词,以适应除CRUD之外的其他场景。 HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。 HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。 在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。 丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。 马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。

蟑螂最害怕什么?如何驱赶蟑螂最有效?家里驱除蟑螂最好的办法!

蟑螂是常见的室内害虫,它们的出现不仅影响家居环境的整洁,还可能带来健康隐患。 为了有效地驱赶蟑螂,我们首先需要了解它们的生活习性和害怕的因素,然后采取科学合理的方法进行防治蟑螂的生活习性与害怕的因素要驱赶蟑螂,首先需要了解它们的生活习性和最害怕的因素。 蟑螂是夜行性昆虫,白天通常躲藏在暗处,比如墙角、家具缝隙和厨房等地。 它们对寒冷和干燥环境比较敏感,喜欢潮湿和温暖的地方。 蟑螂是杂食性昆虫,主要以碳水化合物和蛋白质为食,容易在食物残渣和垃圾堆积的地方繁殖滋生。 另外,蟑螂对某些气味和化学物质也感到恐惧,比如甲醛、松香、薄荷等气味,以及一些天然的驱虫物质。 了解了这些生活习性和害怕的因素,我们可以有针对性地采取措施来驱赶蟑螂。 最有效的驱赶方法1、保持卫生: 卫生是防治蟑螂的首要方法。 定期清扫地面、清洗厨房、储存食物时使用密封容器,以及定期处理垃圾都能够减少蟑螂的食物来源,降低蟑螂滋生的可能性。 2、修复漏洞: 密封墙壁、地板和天花板上的裂缝和孔洞,减少蟑螂的进入途径。 同时,注意修复水管和排水系统中的漏水问题,以减少潮湿环境。 3、利用气味和化学物质: 利用蟑螂害怕的气味可以制作驱虫喷雾,喷洒在蟑螂常出没的区域。 此外,市售的驱虫剂和杀虫剂也可以用于驱赶蟑螂,但使用时要注意安全,避免食品和儿童接触。 4、设置陷阱和粘贴板: 在蟑螂经常出现的地方设置蟑螂陷阱或粘贴板,可以吸引并捕捉蟑螂。 这些陷阱和粘贴板通常含有引诱剂,对蟑螂有较强的吸引力。 5、天然驱虫剂: 一些天然物质也有驱赶蟑螂的效果,如硼酸粉、二氧化硅粉等。 这些物质对人类和宠物相对较安全,可以撒在蟑螂经常出没的区域。 6、定期检查和维护: 建立定期的检查制度,及时发现蟑螂问题,采取相应的措施。 同时,保持室内通风,减少潮湿,也能让蟑螂不易繁殖。 家里驱除蟑螂的最佳实践综合以上驱虫方法,我们可以制定出家里驱除蟑螂的最佳实践:1、清洁卫生: 坚持室内清洁,尤其是厨房和餐厅区域,清除食物残渣和垃圾。 定期清理地板、桌面和灶具,减少蟑螂的食物来源。 2、修复漏洞: 密封墙壁和地板上的裂缝,修复漏水问题,降低蟑螂进入的途径,创造一个不利于它们栖息的环境。 3、使用驱虫剂: 根据需要可以使用天然驱虫剂、市售驱虫剂或者制作驱虫喷雾,对蟑螂出没区域进行喷洒。 但务必注意使用时的安全。 4、设置陷阱和粘贴板: 在蟑螂常出没的地方设置陷阱和粘贴板,捕捉并监控蟑螂的数量。 5、保持通风: 保持室内通风,减少潮湿,使蟑螂不易繁殖。 6、定期检查: 建立定期的检查制度,定期查看蟑螂是否有所减少,需要时及时采取相应措施。 总之,蟑螂虽然顽固,但通过了解其生活习性和害怕的因素,以及采取科学的驱虫方法,我们可以有效地驱赶蟑螂,创造一个清洁、健康的家居环境。 保持卫生、修复漏洞、使用驱虫剂和陷阱、保持通风和定期检查,这些综合的方法可以帮助您有效地驱除蟑螂,保护家庭的健康和舒适。

接口的最佳实践和常见陷阱

如何设计好的RESTful API

安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。 那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。 HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。 那么,您认为一个好的RESTful API应该具有哪些特征呢? 李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 浏览器是最常见和最通用的REST客户端。 好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。 这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。 Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。 RESTful API建模的过程与面向对象建模类似,是以名词为核心的。 这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。 而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。 对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。 所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。 将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。 设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。 这个API应该是松耦合的。 RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。 正是这三个层次确保了RESTful API的松耦合性。 当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。 紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。 尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。 REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。 感兴趣的读者可以参考《REST实战》。 这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。 资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。 GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。 这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。 所以除非有很合理的要求,通常不需要使用自定义的私有格式。 使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。 响应状态代码分成两部分:status code和reason phase。 两部分都是可定制的,也可以使用标准的status code,只定制reason phase。 如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。 这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。 HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。 而在整个HTTP通信链条的很多位置,都可以设置缓存。 HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。 如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。 李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。 我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。 比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。 HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。 再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。 而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。 丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。 马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。 包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。 但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。 提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。 InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。 那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。 要求接入方的请求中必须加上签名参数。 这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。 其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。 使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。 HTTP Digest身份认证可以单独使用,具备中等程度的安全性。 HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。 不过插入自定义加密算法在面向互联网的API中用的不是很多。 这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。 优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。 在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。 HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。 缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。 使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。 其中的加密机制与HTTP Digest身份认证相比,安全性更高。 需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。 OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。 如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。 对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。 仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。 身份认证之后的授权,主要是由应用来控制。 通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。 李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。 当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。 但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。 至于WS-族的协议,我不太了解,不太能参与讨论。 丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。 例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。 在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。 如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。 马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。 InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。 另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。 不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。 李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。 丁雪丰:个人认为最好的版本化,就是没有明显的版本。 在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。 例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。 如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。 也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。 马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。 另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 或者 /v1/ 这样。 InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。 如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。 CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。 HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。 我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。 如果在资源上定义的操作过多,我们会选择拆分出更多的资源。 李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。 但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。 另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。 基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。 丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。 其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。 如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。 马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。 InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。 我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。 b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。 c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。 这三部分的内容对于开发者来说都很有用。 遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。 李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。 InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。 李锟:这个问题我就不详细回答了。 不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。 开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。 保持多样性是繁荣生态环境的基础。 像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。 这些框架目前都做的不错。 我对框架的选择没有倾向性。 RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。 李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。 REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。 当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。 另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。 丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。 如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。 如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。 REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。 马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。 轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。 InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。 HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。 兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。 改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。 更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。 应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。 废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。 增加更多的动词,以适应除CRUD之外的其他场景。 HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。 HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。 在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。 丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。 马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。



相关标签: 接口的最佳实验方法接口的最佳实践和常见陷阱

上一篇:SQL语句掌握数据库查询和操作的强大工具sql

下一篇:接口与继承的比较接口与继承的区别

内容声明:

1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/aaa91f1c4be0e3ba9b69.html,复制请保留版权链接!


温馨小提示:在您的网站做上本站友情链接,访问一次即可自动收录并自动排在本站第一位!
随机文章
高效的在线转换平台:满足您的转换需求 (在线转换平台)

高效的在线转换平台:满足您的转换需求 (在线转换平台)

body,font,family,Arial,Helvetica,sans,serif,font,size,16px,color,333,h1,font,size,24px,margin,bottom,20px,ul,list,style,type,none,padding,0,margin,0,li,margin,bottom...。

本站公告 2024-09-29 18:35:43

迭代器模式:设计模式在遍历和处理集合中的数据 (迭代器模式)

迭代器模式:设计模式在遍历和处理集合中的数据 (迭代器模式)

迭代器模式是一种设计模式,它允许客户端以顺序方式遍历和处理集合中的数据,而无需了解集合的内部结构,问题在遍历和处理集合中的数据时,我们通常会遇到以下问题,客户端需要了解集合的内部结构,以便遍历数据,客户端需要确保遍历过程的安全并防止并发问题,解决方案迭代器模式提供了一种分离客户端和集合内部结构的方法,它通过引入一个迭代器对象来实现这一...。

互联网资讯 2024-09-27 12:16:22

Flex 与移动开发的完美融合:跨平台应用程序的最佳实践 (flex和flexbox)

Flex 与移动开发的完美融合:跨平台应用程序的最佳实践 (flex和flexbox)

随着移动设备的普及,跨平台应用程序开发变得越来越重要,其中,Flex和Flexbox作为强大的布局和样式工具,在构建响应式且用户友好的移动应用程序方面扮演着至关重要的角色,Flex布局Flex布局是一种CSS布局模型,它允许开发人员使用简单而灵活的方式在容器中安排元素,它基于以下关键概念,容器,包含元素的父元素,弹性元素,容器内的子元...。

最新资讯 2024-09-25 05:59:37

全面的 Linux 入门指南:从零基础到高级技能 (全面的临床检查对于确定卒中后肩痛)

全面的 Linux 入门指南:从零基础到高级技能 (全面的临床检查对于确定卒中后肩痛)

目录简介安装Linux基本命令文件管理用户管理包管理网络配置故障排除高级主题简介Linux是一个免费开源的操作系统,因其稳定性、安全性、可靠性和自定义性而闻名,它最初由LinusTorvalds于1991年创建,此后一直在积极开发,今天,Linux已广泛用于服务器、桌面、嵌入式系统和其他许多应用程序中,本指南旨在为Linux初学者提供...。

最新资讯 2024-09-24 20:32:59

掌握 CSS 转盘的艺术:从初学者到专家 (css怎么转换成html)

掌握 CSS 转盘的艺术:从初学者到专家 (css怎么转换成html)

CSS转盘是掌握CSS中颜色属性的重要工具,使用它,你可以轻松地选择、混合和调整颜色,创建视觉上吸引人的网页设计,CSS转盘简介CSS转盘是一个圆形图表,代表了可用于CSS的所有颜色,它按以下方式组织,原色,红色、黄色和蓝色,这是所有其他颜色的基础,二次色,橙色、绿色和紫色,这些颜色通过混合原色创建,三级色,这些颜色通过混合原色和二次...。

本站公告 2024-09-17 04:04:53

供应商信息(供应商基本情况表填写范本)

供应商信息(供应商基本情况表填写范本)

以下内容为供应商基本情况表填写范本,序号项目填写要求填写示例1供应商名称填写供应商的全称北京某某科技有限公司2供应商地址填写供应商的详细地址北京市海淀区某某路某某号某某大厦3供应商联系人填写供应商的对接人的姓名张三4供应商联系电话填写供应商的对接人的联系电话138123456785供应商邮箱填写供应商的对接人的邮箱地址zhangsan...。

技术教程 2024-09-15 19:04:18

指数函数求导的公式揭秘 (指数函数求导公式)

指数函数求导的公式揭秘 (指数函数求导公式)

u003c,sup>,应用指数函数求导公式在许多应用中都有着广泛的应用,这里举几个例子,物理学,指数函数用于描述许多物理现象,如热传递、放射性衰变和电容充放电,金融学,指数函数用于描述复利增长和指数基金的收益率,生物学,指数函数用于描述种群增长和药物浓度的变化,结论指数函数求导公式是微积分中一个非常重要的公式,它有着广泛的应用,...。

互联网资讯 2024-09-13 13:58:06

设置 Java 环境变量的全面指南:从基础到实践 (设置java环境变量的目的)

设置 Java 环境变量的全面指南:从基础到实践 (设置java环境变量的目的)

设置Java环境变量的目的环境变量是存储有关操作系统或应用程序配置的信息的特殊变量,对于Java应用程序,环境变量对于以下目的至关重要,指定Java虚拟机,JVM,的位置设置类路径,该路径指定JVM应搜索类文件的位置配置其他Java相关设置,例如堆内存大小和垃圾收集器选项通过正确设置Java环境变量,您可以确保Java程序能够正常运行...。

互联网资讯 2024-09-11 22:20:48

掌握指针函数:提高编程技能的终极指南 (掌握指针函数的方法)

掌握指针函数:提高编程技能的终极指南 (掌握指针函数的方法)

简介指针函数是C和C,编程中的一个强大工具,可以显著提高你的编程技能,通过理解指针函数的工作原理,你可以编写出更简洁、更高效、更可维护的代码,本文将指导你掌握指针函数,并提供一系列示例和练习来巩固你的理解,指针函数的概念指针函数是一种指向函数的指针,这意味着它们存储的是函数的内存地址,而不是函数本身,你可以使用指针函数来间接调用函数...。

技术教程 2024-09-09 07:08:03

故障排除 PHP 与 Microsoft SQL Server 连接的常见问题 (故障排除培训记录)

故障排除 PHP 与 Microsoft SQL Server 连接的常见问题 (故障排除培训记录)

本文档旨在帮助您解决PHP与MicrosoftSQLServer连接时遇到的常见问题,如果您正在与连接问题作斗争,请按照以下步骤进行操作,检查您的连接信息确保您正在使用正确的服务器名称或IP地址,确保您正在使用正确的数据库名称,确保您正在使用正确的用户名和密码,检查您的PHP配置确保您已经安装了PHPSQLServer扩展,确保您已经...。

本站公告 2024-09-06 21:20:29

揭开ASP源代码的神秘面纱:一步一步的指南 (asp开源网站)

揭开ASP源代码的神秘面纱:一步一步的指南 (asp开源网站)

ASP,ActiveServerPages,是一种由微软开发的服务器端脚本语言,用于创建动态网页,它允许开发人员使用VBScript或Jscript等脚本语言在网页中嵌入服务器端逻辑,ASP源代码ASP源代码是一组包含HTML、脚本和指令的文本文件,它使用.asp扩展名,并由ASP引擎处理,ASP引擎解析源代码,执行脚本逻辑,并生成包...。

最新资讯 2024-09-06 13:26:37

织梦安全二次开发:保护网站免受威胁 (织梦安全加固)

织梦安全二次开发:保护网站免受威胁 (织梦安全加固)

织梦,DedeCMS,作为国内领先的CMS系统,因其强大的功能和良好的扩展性而受到众多网站开发者的青睐,随着网络安全形势的日益严峻,织梦的安全问题也日益突出,为了保护网站免受威胁,有必要对织梦进行二次开发以加强其安全性,织梦的安全隐患织梦系统自身存在一些安全隐患,主要表现在以下几个方面,数据库注入漏洞,织梦系统默认使用MySQL数据库...。

技术教程 2024-09-06 00:08:52