这个问题涉及一个非常大的面积,我怀疑任何一个单一的答案可以涵盖详细事宜。我能做的是根据我所犯的错误提供一些起点。
建立在自己的API基础上
不要将API功能添加到现有系统。这样做会:
- 导致额外的测试负载(你必须来测试您的应用程序和独立的API)
- 导致增加总体维护成本
- 导致质量较差API比您想要提供的要多
您的总体目标应该是先构建API,然后在自己的API之上构建应用程序。这样做有以下好处:
- API的测试本质上是同时的应用测试
- 你会不会“忘记”添加任何所需的API方法
你的应用程式和执行应用程序逻辑(API)在逻辑上是分开的 - 在等式的每一方面以及它所负责的方面,它们之间将存在明确的分离。这将有助于指导发展。这也将使您可以非常轻松地将应用程序和API放在不同的机器上,并在需要时使用。
使用自己的API是一个很重要的一点。您的API的设计最初是次优的,只有通过自己使用它,您才能够以高效的方式向人们提供实际所需的功能。
你会最终有一个系统,它大致是这样的:
------------- -------------
| | | |
| Your APP | <= HTTP communication => | Your API |
| | | |
------------- -------------
这凸显了一些进一步的好处:你可以与任何其他应用程序替换“你的APP”,让你的客户创造的应用程序,以用最适合他们的方式处理事情。您还可以在现有API之上创建新版本的应用程序 - 移至新版本的公共网站可能会更容易。
设计你的URL:映射类和方法
选择明智的网址是太大的问题,只要选择合理的类和方法名。从类及其方法派生URL是一种好方法。如果URL和类/方法之间没有明显的相关性,那么从长远来看,您会发现难以维护的事情。
我个人更喜欢的网址类和方法通过以下方式联系起来:
例子:
你的API的网址https://api.camerareadyart.com。
你有toColour()
和toBlackAndWhite()
方法的image
对象。
这可能映射到:
https://api.camerareadyart.com/image/toColour/
https://api.camerareadyart.com/image/toBlackAndWhite/
同样的位图矢量转换:
https://api.camerareadyart.com/bitmap/toVector/
设计反应
当有人被从数据或信息的数据,一个你网址,会发生什么?如何处理错误,如何处理例外?回答采取什么形式?
我不能告诉你该做什么。就我个人而言,我更喜欢将事物与HTTP紧密映射,然后在需要时才超越此范围。
例如,如果进入的请求被接受并且被处理,但遇到错误内部我会发出500个状态响应。同样,如果给定的API方法需要未提供的身份验证,则可能会发出403.利用现有的HTTP功能可以防止您重新创建某些内容。
使用HTTP
除了使用HTTP状态代码理智的现有的方面,一定要到处寻找一个仅HTTP滚动自己的解决方案之前,做一些方法。
希望用户可以指定是否响应格式应通过XML或JSON?使用HTTP Accept头。
想重新直接客户,以不同的URL抢请求的结果?使用HTTP位置标题。
有许多功能,HTTP已经处理,你可能想要做很多事情。使用它们!
安全
一般有两种问题在这里解决:对用户进行认证,并确定什么样的行动给定用户可以执行。
安全性:身份验证
用户需要在他们的请求中指定他们是谁。
首先想到的解决方案是允许用户指定用户名和密码,可能与用于访问您的应用的用户名和密码相同。表面看来这是一个好主意,但它并不理想。
用户最终将自己的用户名和密码烘焙到他们自己的应用程序中。不可避免地,一个用户会忘记他们的密码,并会改变它,以便他们可以愉快地访问您的应用程序,在此过程中打破他们自己的应用程序。
用户提供一个更好的选择是提供一个认证令牌,它基本上是一个用户唯一的唯一值,就像用户名和密码合并为一个一样。
这允许您在逻辑上将用户名和密码与访问API分开。用户可以随时更改自己的应用的用户名和/或密码,而不会中断他们对API的访问。
用户还可以拥有多个API令牌,每个令牌具有不同的访问级别,允许用户安全地将API令牌发送给第三方服务。
安全性:访问控制
至于外界关注的是,你的API是一组URL。根据定义,每个URL都是唯一的,并执行一项独特的任务。围绕这些概念设置访问控制机制是一个很好的起点。
我更愿意保留令牌允许访问的URL的每个令牌的列表。当使用给定的令牌访问URL时,告知访问哪个URL以及它是否位于令牌的允许的URL列表中是微不足道的。
如果您明智地选择了一组URL,其中每个URL执行一个独特的操作,此过程将为您提供关于您将获得的最佳级别的访问控制。
为了提供更精细的控制级别,您可能还需要指定每个允许访问令牌的URL,允许使用哪些查询参数。
感谢您的回复。 这意味着我应该将API实现为Web服务。因为只有Web服务才能够公开API,并且用户只能通过它进行连接。 我是对的还是另一种方式? web serveice将如何提供。托管公司是否需要在服务器上进行任何更改? – 2009-08-10 04:32:07