• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Thinkphp 在api开发中异常返回依然是html的解决方式

    现在谁不开发接口的呢?但是在接口开发过程中,报错误异常后居然返回错误的信息依然是html信息!TP官方也不知道为啥不添加,说好的为接口而生,我的解决方案也很简单,把系统的异常处理类复制出来,去掉模板相关,直接以json方式输出

    下面是解决方案:

    1:按照TP扩展异常的方式引用这个文件

    https://www.kancloud.cn/manual/thinkphp5_1/354092

    // 判断默认输出类型
    // $app 是配置数组
    if ($app['default_return_type'] == 'json') {
     // 异常处理handle类 留空使用 \think\exception\Handle
     $app['exception_handle'] = '\\app\\common\\exception\\JsonException';
    }
    return $app;

    异常处理类:

    ?php
    
     namespace app\common\exception;
    
    
     use Exception;
     use think\exception\ErrorException;
     use think\exception\Handle;
     use think\exception\HttpException;
     use think\console\Output;
     use think\Container;
     use think\Response;
    
    
     class JsonException extends Handle
     {
      protected $render;
      protected $ignoreReport = [
       '\\think\\exception\\HttpException',
      ];
    
      public function setRender($render)
      {
       $this->render = $render;
      }
    
      /**
      * Report or log an exception.
      *
      * @access public
      * @param \Exception $exception
      * @return void
      */
      public function report(Exception $exception)
      {
       if (!$this->isIgnoreReport($exception)) {
       // 收集异常数据
       if (Container::get('app')->isDebug()) {
        $data = [
         'file' => $exception->getFile(),
         'line' => $exception->getLine(),
         'message' => $this->getMessage($exception),
         'code' => $this->getCode($exception),
        ];
        $log = "[{$data['code']}]{$data['message']}[{$data['file']}:{$data['line']}]";
       } else {
        $data = [
         'code' => $this->getCode($exception),
         'message' => $this->getMessage($exception),
        ];
        $log = "[{$data['code']}]{$data['message']}";
       }
    
       if (Container::get('app')->config('log.record_trace')) {
        $log .= "\r\n" . $exception->getTraceAsString();
       }
    
       Container::get('log')->record($log, 'error');
       }
      }
    
      protected function isIgnoreReport(Exception $exception)
      {
       foreach ($this->ignoreReport as $class) {
       if ($exception instanceof $class) {
        return true;
       }
       }
    
       return false;
      }
    
      /**
      * Render an exception into an HTTP response.
      *
      * @access public
      * @param \Exception $e
      * @return Response
      */
      public function render(Exception $e)
      {
       if ($this->render  $this->render instanceof \Closure) {
       $result = call_user_func_array($this->render, [$e]);
    
       if ($result) {
        return $result;
       }
       }
    
       if ($e instanceof HttpException) {
       return $this->renderHttpException($e);
       } else {
       return $this->convertExceptionToResponse($e);
       }
      }
    
      /**
      * @access public
      * @param Output $output
      * @param Exception $e
      */
      public function renderForConsole(Output $output, Exception $e)
      {
       if (Container::get('app')->isDebug()) {
       $output->setVerbosity(Output::VERBOSITY_DEBUG);
       }
    
       $output->renderException($e);
      }
    
      /**
      * @access protected
      * @param HttpException $e
      * @return Response
      */
      protected function renderHttpException(HttpException $e)
      {
       $status = $e->getStatusCode();
       $template = Container::get('app')->config('http_exception_template');
    
       if (!Container::get('app')->isDebug()  !empty($template[$status])) {
       return Response::create($e, 'json', $status);
       } else {
       return $this->convertExceptionToResponse($e);
       }
      }
    
      /**
      * @access protected
      * @param Exception $exception
      * @return Response
      */
      protected function convertExceptionToResponse(Exception $exception)
      {
       // 收集异常数据
       if (Container::get('app')->isDebug()) {
       // 调试模式,获取详细的错误信息
       $data = [
        'name' => get_class($exception),
        'file' => $exception->getFile(),
        'line' => $exception->getLine(),
        'message' => $this->getMessage($exception),
        'trace' => $exception->getTrace(),
        'code' => $this->getCode($exception),
        'source' => $this->getSourceCode($exception),
        'datas' => $this->getExtendData($exception),
        'tables' => [
         'GET Data'    => $_GET,
         'POST Data'    => $_POST,
         'Files'     => $_FILES,
         'Cookies'    => $_COOKIE,
         'Session'    => isset($_SESSION) ? $_SESSION : [],
         'Server/Request Data' => $_SERVER,
         'Environment Variables' => $_ENV,
         'ThinkPHP Constants' => $this->getConst(),
        ],
       ];
       } else {
       // 部署模式仅显示 Code 和 Message
       $data = [
        'code' => $this->getCode($exception),
        'message' => $this->getMessage($exception),
       ];
    
       if (!Container::get('app')->config('show_error_msg')) {
        // 不显示详细错误信息
        $data['message'] = Container::get('app')->config('error_message');
       }
       }
    
       //保留一层
       while (ob_get_level() > 1) {
       ob_end_clean();
       }
    
       $data['echo'] = ob_get_clean();
    
       $response = Response::create($data, 'json');
    
       if ($exception instanceof HttpException) {
       $statusCode = $exception->getStatusCode();
       $response->header($exception->getHeaders());
       }
    
       if (!isset($statusCode)) {
       $statusCode = 500;
       }
       $response->code($statusCode);
    
       return $response;
      }
    
      /**
      * 获取错误编码
      * ErrorException则使用错误级别作为错误编码
      * @access protected
      * @param \Exception $exception
      * @return integer    错误编码
      */
      protected function getCode(Exception $exception)
      {
       $code = $exception->getCode();
    
       if (!$code  $exception instanceof ErrorException) {
       $code = $exception->getSeverity();
       }
    
       return $code;
      }
    
      /**
      * 获取错误信息
      * ErrorException则使用错误级别作为错误编码
      * @access protected
      * @param \Exception $exception
      * @return string    错误信息
      */
      protected function getMessage(Exception $exception)
      {
       $message = $exception->getMessage();
    
       if (PHP_SAPI == 'cli') {
       return $message;
       }
    
       $lang = Container::get('lang');
    
       if (strpos($message, ':')) {
       $name = strstr($message, ':', true);
       $message = $lang->has($name) ? $lang->get($name) . strstr($message, ':') : $message;
       } elseif (strpos($message, ',')) {
       $name = strstr($message, ',', true);
       $message = $lang->has($name) ? $lang->get($name) . ':' . substr(strstr($message, ','), 1) : $message;
       } elseif ($lang->has($message)) {
       $message = $lang->get($message);
       }
    
       return $message;
      }
    
      /**
      * 获取出错文件内容
      * 获取错误的前9行和后9行
      * @access protected
      * @param \Exception $exception
      * @return array     错误文件内容
      */
      protected function getSourceCode(Exception $exception)
      {
       // 读取前9行和后9行
       $line = $exception->getLine();
       $first = ($line - 9 > 0) ? $line - 9 : 1;
    
       try {
       $contents = file($exception->getFile());
       $source = [
        'first' => $first,
        'source' => array_slice($contents, $first - 1, 19),
       ];
       } catch (Exception $e) {
       $source = [];
       }
    
       return $source;
      }
    
      /**
      * 获取异常扩展信息
      * 用于非调试模式html返回类型显示
      * @access protected
      * @param \Exception $exception
      * @return array     异常类定义的扩展数据
      */
      protected function getExtendData(Exception $exception)
      {
       $data = [];
    
       if ($exception instanceof \think\Exception) {
       $data = $exception->getData();
       }
    
       return $data;
      }
    
      /**
      * 获取常量列表
      * @access private
      * @return array 常量列表
      */
      private static function getConst()
      {
       $const = get_defined_constants(true);
    
       return isset($const['user']) ? $const['user'] : [];
      }
    
     }
    

    以上这篇Thinkphp 在api开发中异常返回依然是html的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 再谈PHP错误与异常处理
    • PHP中的异常处理机制深入讲解
    • php中try catch捕获异常实例详解
    • Thinkphp5框架异常处理操作实例分析
    • 让whoops帮我们告别ThinkPHP6的异常页面
    • Laravel 解决composer相关操作提示php相关异常的问题
    • PHP使用观察者模式处理异常信息的方法详解
    • php异常处理捕获错误整理
    • PHP批斗大会之缺失的异常详解
    • PHP中的异常及其处理机制
    上一篇:PHP 代码简洁之道(小结)
    下一篇:Laravel 连接(Join)示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Thinkphp 在api开发中异常返回依然是html的解决方式 Thinkphp,在,api,开发,中,异常,