用于构建restful API的良好资源


Good resource for building restful API

我正在寻找一个好的资源,它将向我展示构建一个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。许多公司仍然在生产环境中使用它。您可以选择两种不同的方法来构建基础设施:

  1. 从头开始构建与PHP API直接接口的一切
  2. 停留在上层,与第三方对接,开放源库来执行一些乏味的过程,例如路由,身份验证等等

第二种方法通过将一些常见操作委托给可信的第三方编写的代码,可以节省时间并更多地关注业务逻辑。

例如,您可以检查PHP应用程序中常用的这些库,以更快地完成任务:

  1. https://github.com/chriso/klein.php帮助您执行路由
  2. https://github.com/PHPAuth/PHPAuth帮助您进行身份验证过程(另请检查https://github.com/firebase/php-jwt用于无状态身份验证)。

  3. 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的看法。