我正在寻找一个好的资源,它将向我展示构建一个restful API的正确方法。有趣的主题:特别是身份验证和一般的安全性、性能、可扩展性、最佳实践和其他有用的东西。
我将用PHP(Slim或Silex)构建它,在开始之前,我想考虑一下整个设计,这样我就可以从一开始就走正确的路。
网上有很多信息和帖子,但它们都采用了不同的做法和方法。
在宁静的世界里,有什么东西看起来像是"标准"吗?
有没有什么东西看起来像";标准";在宁静的世界里?
不超过使用HTTP的级别。有很多用于编码API数据的媒体类型(请参阅下面的超媒体)、许多不同的最佳实践和大量的RFC,这些RFC涵盖了使用HTTP的各个方面(例如使用OAuth2的授权)。
以下是值得一读的资源汇编。。。我想你读一两本书会得到最大的收获。
授权资源
- Fieldings关于REST的原创论文:http://www.ics.uci.edu/~fielding/pubs/discussion/top.htm
书籍
- RESTful Web API:http://shop.oreilly.com/product/0636920028468.do
- RESTful Web服务食谱:http://shop.oreilly.com/product/9780596801694.do
- REST实践:http://shop.oreilly.com/product/9780596805838.do
- RESTful Web服务:http://amzn.com/0596529260
- Web API设计:https://pages.apigee.com/web-api-design-website-h-ebook-registration.html
- 关于REST的InfoQ电子杂志:http://www.infoq.com/minibooks/emag-rest
身份验证
- 基本注意事项:http://soabits.blogspot.dk/2014/02/api-authentication-considerations-and.html
- OAuth2规范:https://www.rfc-editor.org/rfc/rfc6749
错误处理
- 最佳实践:http://soabits.blogspot.dk/2013/05/error-handling-considerations-and-best.html
- "vnd.error";错误详细信息的媒体类型:https://github.com/blongden/vnd.error
- HTTP API的问题详细信息:https://datatracker.ietf.org/doc/html/draft-ietf-appsawg-http-problem-00
超媒体
- 菲尔丁著名的咆哮:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
- 销售超媒体的好处:http://soabits.blogspot.dk/2013/12/selling-benefits-of-hypermedia.html
- HAL介质类型:HAL:http://stateless.co/hal_specification.html
- Sirene介质类型:Sirene:https://github.com/kevinswiber/siren
- 集合+JSON:http://amundsen.com/media-types/collection/format/
- JSON API:http://jsonapi.org/
- Hydra:http://www.markus-lanthaler.com/hydra/
- RFC 5988 Web链接https://www.rfc-editor.org/rfc/rfc5988
URL结构
- 基本注意事项:http://soabits.blogspot.dk/2013/10/url-structures-and-hyper-media-for-web.html
部分更新
- 关于部分更新的注意事项:http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html
- JSON修补程序:https://www.rfc-editor.org/rfc/rfc6902
关于PHP构建rest API的一些考虑
PHP是一种使用多年的技术。
但在这段漫长的时间里,它显示出了一些相关的问题:它成为了一种可怕的技术,其使用显示出一些安全漏洞,如SQL注入、缺乏集中的打包注册表、API不一致和性能较差。对于构建RESTapi,有更现代的技术,比如RubyonRails和Django,或者Node.js,它们很容易接近。
使用PHP构建Rest APIS
当然,如果在过去几年中出现了更好的技术,您也可以在php中构建api。许多公司仍然在生产环境中使用它。您可以选择两种不同的方法来构建基础设施:
- 从头开始构建与PHP API直接接口的一切
- 停留在上层,与第三方对接,开放源库来执行一些乏味的过程,例如路由,身份验证等等
第二种方法通过将一些常见操作委托给可信的第三方编写的代码,可以节省时间并更多地关注业务逻辑。
例如,您可以检查PHP应用程序中常用的这些库,以更快地完成任务:
- https://github.com/chriso/klein.php帮助您执行路由
-
https://github.com/PHPAuth/PHPAuth帮助您进行身份验证过程(另请检查https://github.com/firebase/php-jwt用于无状态身份验证)。
-
https://github.com/mongodb/mongo-php-driver(mongodb)或https://github.com/cagartner/sql-anywhere-client(SQL)您将需要与数据库接口,此链接是一些客户端库的示例,可以帮助您完成任务
使用node.js之类的东西
Node.js是一种现代技术,它可以让人们做你要做的事情。它快速、可扩展(php较少)、易于使用,并且有一个非常狂热的社区来编写代码和共享开源。
例如,使用http://expressjs.com/您可以在几分钟内管理应用程序的整个路由。您用javascript编写应用程序,因此您将不得不担心生理javascript的问题(闭包、异步调用等),但在解决了这一相当棘手的部分后,使用node.js,您将构建更高效的rest API,并且您的服务器将需要更少的CPU和功率来接受和回答请求。
对于最佳实践,GitHub上有一个很好的指南存储库。您可以访问以下页面了解更多信息:
http api设计
您也可以查看Apary来设计API:
Apary
对于身份验证,实际上最好的做法是依赖于一个框架,而不是从头开始重新实现。然而,出于学习目的,这是另一种情况,但为了将其投入生产,最好的选择是使用框架提供的内容。大多数框架都有一个很好的实现,社区可能会随着时间的推移进行迭代,使其非常健壮。某些框架(如laravel)也为csrf(跨站点请求伪造)攻击提供了解决方案。
您可以研究的另一个有用的东西是JWT(JSONWebToken)。这里有一个有用的链接,总结了为什么它如此棒:
JWT 的无状态代币
我不知道如何从API的角度来看待可伸缩性。对我来说,这更像是一个基础设施问题。然而,使用身份验证(基于会话或令牌),可扩展性可能会成为一个问题,例如,如果您有不同数量的实例为用户服务,则需要维护粘性会话或存储在快速访问键值存储或数据库中的会话。
请看一看我对基于JSON-LD、SemWeb和Hydra-Core的REST API的看法。