JSON

【技术分享】API安全架构之抽丝剥茧(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-29 10:20 我要评论( )

我想在这里需要提到的最后一个特殊的选项就是使用errorHandler。在我选择的应用程序结构中,我们将利用PHP的异常处理特性在出现错误时停止执行,并向用户报告错误。这样可以防止我们在我们的控制器内部直接输出JSON

我想在这里需要提到的最后一个特殊的选项就是使用errorHandler。在我选择的应用程序结构中,我们将利用PHP的异常处理特性在出现错误时停止执行,并向用户报告错误。这样可以防止我们在我们的控制器内部直接输出JSON并在一些奇怪的地方做任何其他比较诡异的事情。如果发现错误,就应该立即返回,而不是继续往下执行。

该errorHandler比前面的例子更详细一点。示例代码如下:


$container['errorHandler'] = function($container) {     return function ($request, $response, $exception = null) use ($container) {         $code = 500;         $message = 'There was an error';           if ($exception !== null) {             $code = $exception->getCode();             $message = $exception->getMessage();         }           // Use this for debugging purposes         /*error_log($exception->getMessage().' in '.$exception->getFile().' - ('             .$exception->getLine().', '.get_class($exception).')');*/           return $container['response']             ->withStatus($code)             ->withHeader('Content-Type', 'application/json')             ->write(json_encode([                 'success' => false,                 'error' => $message             ]));     }; };

现在,这个处理程序应该看起来很熟悉了,具有相同的功能签名和返回相同的响应对象。但有一些差异,主要是处理例外的情况。你会注意到$exception在内部闭包中有一个新的参数。这是通过Slim的内部功能传递给了错误处理程序,因此我们可以评估抛出的异常。在我们的例子中,我们设置了一个默认值$code,如果未设置异常(并非所有错误都是异常)则为$message,然后如果设置了异常,则会更新这些值。在我们的设置中,我们将使用异常的“代码”值作为我们返回的HTTP状态代码。这让我们控制了控制器内部的response对象然后使用此代码返回该对象,该异常中提供的消息和一个值为false的success对象。在我们的API中使用这个success对象值的返回结构都是一致的,并且将与每个响应一起返回(保存错误响应)。在我们的控制器中,我们可以抛出异常,这样errorHandler就可以正确地处理它们了:


$app = new \Slim\App(); $app->get('/', function() {     throw new \Exception("You shouldn't have done that!", 418); }); $app->run();

这将导致如下的响应内容:


{     success: false,     error: "You shouldn't have done that!" }

响应中的HTTP状态码将在路由中的异常throw中指定。最后,你还可以使用自定义的异常,通过在类中定义它们,并使自定义的异常更具可重用性(例如CouldNotSaveRecord或InvalidInput异常)。


最后一件事

我想在转到本系列的下一部分之前,做最后一次更新。在我们目前的设置中,根路径/响应了一些纯文本的“工作”。这不是很友好的API,现在我们的其他错误处理程序是支持API构建的,当然你也可以改变这一点。Slim的请求/响应处理可以使这种改变变得很容易。我们只是返回一个Response对象作为一个新的实例这与错误处理程序的输出类似:


$app->get('/', function() {     return $response->withHeader('Content-Type', 'application/json')         ->write(json_encode(['message' => 'It works!'])); });

现在,当我们访问到根路径的路由/时,响应将返回一个内容类型为application/json的JSON内容:


{     message: "It works!" }


所以,让我们继续构建这个项目,并尝试一些请求示例和我们在本文中提到的例子。


资源

Slim 框架

第一部分

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://websec.io/2017/05/01/Build_Secure-API-Part2.html

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 求大神分享App接口返回json例子学习一下

    求大神分享App接口返回json例子学习一下

    2017-10-19 16:01

  • Protocol Buffer技术深入理解(C++实例)

    Protocol Buffer技术深入理解(C++实例)

    2017-10-17 14:17

  • PostgreSQL JSON 数据类型 热门技术

    PostgreSQL JSON 数据类型 热门技术

    2017-10-15 16:00

  •  JSON技术引见

    JSON技术引见

    2017-10-15 15:16

网友点评
t