我想在这里需要提到的最后一个特殊的选项就是使用errorHandler。在我选择的应用程序结构中,我们将利用PHP的异常处理特性在出现错误时停止执行,并向用户报告错误。这样可以防止我们在我们的控制器内部直接输出JSON并在一些奇怪的地方做任何其他比较诡异的事情。如果发现错误,就应该立即返回,而不是继续往下执行。
该errorHandler比前面的例子更详细一点。示例代码如下:
现在,这个处理程序应该看起来很熟悉了,具有相同的功能签名和返回相同的响应对象。但有一些差异,主要是处理例外的情况。你会注意到$exception在内部闭包中有一个新的参数。这是通过Slim的内部功能传递给了错误处理程序,因此我们可以评估抛出的异常。在我们的例子中,我们设置了一个默认值$code,如果未设置异常(并非所有错误都是异常)则为$message,然后如果设置了异常,则会更新这些值。在我们的设置中,我们将使用异常的“代码”值作为我们返回的HTTP状态代码。这让我们控制了控制器内部的response对象然后使用此代码返回该对象,该异常中提供的消息和一个值为false的success对象。在我们的API中使用这个success对象值的返回结构都是一致的,并且将与每个响应一起返回(保存错误响应)。在我们的控制器中,我们可以抛出异常,这样errorHandler就可以正确地处理它们了:
这将导致如下的响应内容:
响应中的HTTP状态码将在路由中的异常throw中指定。最后,你还可以使用自定义的异常,通过在类中定义它们,并使自定义的异常更具可重用性(例如CouldNotSaveRecord或InvalidInput异常)。
最后一件事
我想在转到本系列的下一部分之前,做最后一次更新。在我们目前的设置中,根路径/响应了一些纯文本的“工作”。这不是很友好的API,现在我们的其他错误处理程序是支持API构建的,当然你也可以改变这一点。Slim的请求/响应处理可以使这种改变变得很容易。我们只是返回一个Response对象作为一个新的实例这与错误处理程序的输出类似:
现在,当我们访问到根路径的路由/时,响应将返回一个内容类型为application/json的JSON内容:
所以,让我们继续构建这个项目,并尝试一些请求示例和我们在本文中提到的例子。
资源
Slim 框架
第一部分
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://websec.io/2017/05/01/Build_Secure-API-Part2.html