温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用laravel怎么返回统一格式的错误码

发布时间:2021-06-07 17:29:50 来源:亿速云 阅读:258 作者:Leah 栏目:开发技术

使用laravel怎么返回统一格式的错误码?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

问题一:访问接口返回页面代码

最典型的就是laravel new 一个项目后,在浏览器直接访问localhost会进入laravel框架模版的默认欢迎页,这个没有太大的问题,问题就是你用postman把这个地址当接口

调用,返回的就是页面的代码,你在安卓端调用返回的还是页面的代码,其实实际使用不会去调用/跟接口,但是调用接口的时候一些其他的错误比如4xx,5xx都会返回html代码。

安卓端只能通过判断状态码来判断请求的成功失败,而且极难拿到错误信息。其实这里可以在安卓端统一加header,但是...... 于是网上查了下怎么处理

第一种办法解决postman调试的是可以在postman的请求中设置headers X-Requested-With:XMLHttpRequest来模拟ajax请求

第二种办法使项目仅返回JSON格式的需要新建一个Middleware

namespace App\Http\Middleware; use Closure; class JsonApplication {   public function handle($request, Closure $next)   {     $request->headers->set('Accept', 'application/json');     return $next($request);   } }

然后在Kernel中全局注册Middleware并应用所有的api请求(这里因为项目是web-api项目,所以将routes/api.php的namespace去掉了,所以$middlewareGroups中的key是api)

namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel {   protected $middlewareGroups = [     'api' => [       ......       'json_application',     ],   ];   protected $routeMiddleware = [     ......     'json_application' => \App\Http\Middleware\JsonApplication::class,   ]; }

这样配置好后就再也不用担心调用接口,给你返回的是页面代码。

问题二: 接口返回统一的JSON格式

通过上面的配置接口返回数据都是JSON的格式了,但是继续开发会发现,还是需要通过HTTP状态码来判断是否成功,然后返回的JSON里面的key不同的接口差异特别大,即使同一个接口在成功和出错的时候也会返回不同的KEY。

这个问题多采用返回同一格式的问题,由于之前给vue写过很多接口,所以还是沿用之前的key的模式

{   "code": "0",   "msg": "ok",   "data": "" }

但是在laravel中怎么返回这个格式成了一个问题,网上查了好几次,都没有太好的解决办法,多是覆盖的情况不全,再有就是错误码错误信息都写在逻辑层,新加的完全不知道有没有冲突。

后来又在BD和GG搜索好久,自己也尝试用laravel自带的异常机制和Middleware处理,始终不是太满意。

用过JAVA的都知道,在java中处理错误码很方便,直接定义一个枚举把所有的错误代码都写在里面,抛出异常的时候枚举当做参数传递进去。类似于这样

枚举

package *.*.* public enum ErrorCode {   OK("ok", 0),   PARAM_ERROR("param error", 88888),   UNKNOWN_ERROR("unknown error", 99999);   ErrorCode(String value, Integer key) {     this.value = value;     this.key = key;   }   private String value;   private Integer key;   public String getValue() {     return value;   }   public Integer getKey() {     return key;   } }

异常类

package *.*.*; import *.*.*.ErrorCode; public class ApiException extends Exception {   public int code = 0;   public ApiException(ErrorCode errorCode) {     super(errorCode.getValue());     this.code = errorCode.getKey();   }   ...... }

使用

throw new ApiException(ErrorCode.UNKNOWN_ERROR);

于是查了下PHP的枚举,还真支持,但仔细一研究才发现,PHP的枚举不仅要安装开启SPL,然而提供的方法也并没有什么卵用

于是仿照JAVA写了一个

基类

namespace App\Enums; abstract class Enum {   public static function __callStatic($name, $arguments)   {     return new static(constant('static::' . $name));   } }

错误码 这里因为用到了魔术方法,所以要在注视中标注

namespace App\Enums; /**  * @method static CodeEnum OK  * @method static CodeEnum ERROR  */ class CodeEnum extends Enum {   public const OK = ['0', 'ok'];   public const ERROR = ['99999', 'fail'];   private $code;   private $msg;   public function __construct($param)   {     $this->code = reset($param);     $this->msg = end($param);   }   public function getCode()   {     return $this->code;   }   public function getMsg()   {     return $this->msg;   } }

自定义异常类

namespace App\Exceptions; use App\Enums\CodeEnum; use Exception; use Illuminate\Support\Facades\Log; class ApiException extends Exception {   public function __construct(CodeEnum $enum)   {     parent::__construct($enum->getMsg(), $enum->getCode());   }   public function report()   {     Log::error("ApiException {$this->getFile()}({$this->getLine()}): code({$this->getCode()}) msg({$this->getMessage()})");   }   public function render($request)   {     return response([       'code' => $this->getCode(),       'msg' => $this->getMessage(),       'data' => ''     ]);   } }

调用

throw new ApiException(new CodeEnum(CodeEnum::ERROR)); // 这样调总感觉不太好看 throw new ApiException(CodeEnum::OK()); // 这样调用和java的调用方式就很像了

看完上述内容,你们掌握使用laravel怎么返回统一格式的错误码的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI