为了账号安全,请及时绑定邮箱和手机立即绑定

对于Api开发的疑问,求大家解除疑惑

对于Api开发的疑问,求大家解除疑惑

PHP
守着星空守着你 2019-03-11 00:05:19
在开发api的时候是否可以用throw new 抛出http 异常;这样的话感觉就很简单了,比如用户没有登录就直接抛出异常,之后的代码就不会执行; 自定义了一个http异常来接管框架的异常处理! 框架是tp5 还是说用传统的返回数组再上一层调用的时候判断更好些? <?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/1/14/014 * Time: 2:56 */ namespace app\tool\exception; use app\tool\Tool; use Exception; use think\exception\Handle; use think\Request; use think\Log; class ExceptionHandler extends Handle { private $status; //HTTP状态吗 private $msg; //错误具体信息 private $data; //错误码 private $code; public function render(Exception $e) { //如果是自定义异常处理类 if ($e instanceof Base) { $this->status = $e->status; //给状态吗赋值 $this->msg = $e->msg; //给错误信息赋值 $this->data = $e->data; //给错误码复制 $this->code = $e->code; //给错误码复制 } else { if (\think\facade\Config::get('app_debug')) { //如果在测试环境下直接抛出异常 return parent::render($e); } else { //如果是在生产环境下将直接抛出服务器错误的异常 $this->status = 500; $this->msg = "服务器内部错误"; $this->data = ''; } //如果是服务器错误 那么就将错误记录到日志里面 $this->recordErrorLog($e); } //返回JSON结构的数据 $response['status'] = $this->status; $response['msg'] = $this->msg; $response['data'] = $this->data; return json($response, $this->code); } //写日志 private function recordErrorLog(Exception $e) { Log::init([ 'type' => 'File', // 日志保存目录 'path' => LOG_PATH, // 日志记录级别 'level' => ['error'], ]); Log::record($e->getMessage(), 'error'); } } <?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/1/14/014 * Time: 2:47 */ namespace app\tool\exception; use think\Exception; class Base extends Exception { public $status = 0; //HTTP状态吗 public $msg = '参数错误'; //错误具体信息 public $data = []; //错误码 public $code = 200; /** * @desc 构造函数 初始化成员变量 * BaseException constructor. * @param array $params * @throws Exception */ public function __construct($params = []) { //如果传入的参数不是数组就直接抛出异常 if(!is_array($params)){ throw new Exception('参数必须是数组'); } //判断数组中是否存在下标是code的值 //如果存在就给成员变量赋值 if(array_key_exists('status',$params)){ $this->status = $params['status']; } //判断数组中是否存在下标是 msg 的值 //如果存在就给成员变量赋值 if(array_key_exists('msg',$params)){ $this->msg = $params['msg']; } //判断数组中是否存在下标是 error_code 的值 //如果存在就给成员变量赋值 if(array_key_exists('data',$params)){ $this->data = $params['data']; } if(array_key_exists('code',$params)){ $this->code = $params['code']; } } } namespace app\tool\exception; class Http extends Base { public $status = 0; public $data = []; public $msg = "没有数据!"; public $code = 200; } public static function getUid() { $token = Request::header('token'); if (null === $token) { throw new Http(['status' => '-2', 'msg' => '请登录后再操作!']); } $result = Cache::get($token); if (false === $result) { throw new Http(['status' => '-1', 'msg' => '登陆失效,请重新登录!']); } return $result['id']; }
查看完整描述

6 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

送分题,抛出异常,同时如果内容只有 statusmsg 的话建议直接使用 Exception 的内置属性 codemessage,然后在接口入口 catch 的时候做返回格式处理

查看完整回答
反对 回复 2019-03-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

抛自定义异常

查看完整回答
反对 回复 2019-03-18
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

不能直接抛出异常啊,你要返回客户端可以识别的信息才行,包括 http code,错误码,错误信息,不然你倒是爽利了,客户端无法判断错误……

查看完整回答
反对 回复 2019-03-18
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

API抛出自定义异常处理 返回 http200 的json 给前端就好了

查看完整回答
反对 回复 2019-03-18
?
12345678_0001

TA贡献1802条经验 获得超5个赞

API抛出自定义异常处理 返回 httpcode 200 的 json 返回的只要前端能处理就可以 xml也是可以的

查看完整回答
反对 回复 2019-03-18
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

抛出自定义异常即可。
异常捕获那里判断一下如果是自定义异常,就返回{"errmsg":自定义异常消息,"errcode":异常code}

如果不是自定义异常被捕获,证明程序出错了。这时候需要返回一个服务器繁忙给外部,然后记录日志

查看完整回答
反对 回复 2019-03-18
  • 6 回答
  • 0 关注
  • 582 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信