好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > laravel返回統(tǒng)一格式錯誤碼問題

laravel返回統(tǒng)一格式錯誤碼問題

熱門標簽:電銷機器人沒有效果怎么樣 天潤融通外呼系統(tǒng)好嗎 高德地圖標注店鋪收費嗎 泊頭在哪里辦理400電話 杭州語音電銷機器人 高德地圖標注位置怎么標注 江門回撥外呼系統(tǒng) 欣思維地圖標注 江西電銷機器人收費

背景

最近在學習開發(fā)一個安卓項目,后端接口項目開始用PHP的Yii2.0框架新啟了個項目,后換成laravel5.5,最近看到laravel升級了新版本,于是又將項目更新到laravel6.4

在使用yii和laravel的過程中,兩個框架對web-api都非常友好,也都對restful做了不同程度的支持,但是還是遇到了一些問題,下面以laravel6.4為例,簡單描述下我遇到的問題。

問題一:訪問接口返回頁面代碼

最典型的就是laravel new 一個項目后,在瀏覽器直接訪問localhost會進入laravel框架模版的默認歡迎頁,這個沒有太大的問題,問題就是你用postman把這個地址當接口

調用,返回的就是頁面的代碼,你在安卓端調用返回的還是頁面的代碼,其實實際使用不會去調用/跟接口,但是調用接口的時候一些其他的錯誤比如4xx,5xx都會返回html代碼。

安卓端只能通過判斷狀態(tài)碼來判斷請求的成功失敗,而且極難拿到錯誤信息。其實這里可以在安卓端統(tǒng)一加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,
  ];
}

這樣配置好后就再也不用擔心調用接口,給你返回的是頁面代碼。

問題二: 接口返回統(tǒng)一的JSON格式

通過上面的配置接口返回數據都是JSON的格式了,但是繼續(xù)開發(fā)會發(fā)現,還是需要通過HTTP狀態(tài)碼來判斷是否成功,然后返回的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的枚舉,還真支持,但仔細一研究才發(fā)現,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返回統(tǒng)一格式錯誤碼問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • Laravel手動返回錯誤碼示例

標簽:雙鴨山 深圳 大同 石嘴山 平涼 內江 江門 駐馬店

巨人網絡通訊聲明:本文標題《laravel返回統(tǒng)一格式錯誤碼問題》,本文關鍵詞  laravel,返回,統(tǒng)一,格式,錯,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《laravel返回統(tǒng)一格式錯誤碼問題》相關的同類信息!
  • 本頁收集關于laravel返回統(tǒng)一格式錯誤碼問題的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 偷窥沟厕女厕白嫩大屁股 | 亲生(H)辣文h| 美女福利网址| 日日摸夜夜添夜夜添人人爽| 大豆行情网免费v| 石原莉奈一区二区三区在线高清| 色噜噜在线视频| 偷换粗大让娇妻爽| 久久精品a| 老师和学生做爰三级视频播放| 老婆同意多人一起玩怎么聊天| 久久狠色噜噜狠狠狠狠97| 欧美胖乎乎的肥妇BBW| 国产美女mm131爽爽爽爽学生| 久久夜夜操妹子| 久久久久免费看黄a级试看| 天天爱夜夜操| 搡老女人XXXX搡老女人69| 欧洲美一区二区三区亚洲| 欲妇放荡叫床声| 日本美女日b| 成人在线精品| 情瘾(出轨,高H)小说| 《朋友夫妇:交换》3| 成人不卡在线| 攻从小把受睡到大h文| 色情经典K8片在线播放| AsianGV男男GayGay网站| cao在线视频| 疯狂蹂躏禁脔欢爱h| 免看一级一片一在线看| 荡娃艳妇短篇系列目录小说| 老A影视在线一区二区| 午夜在线视频国产极品片| 国产伦精品一区二区三区免| 久久糟糟糟www成人免费直播| 肉色呻吟胯下丝袜高跟视频| 国产香蕉一区二区在线网站| 手机韩剧网| 日本一級片黃色一級片尖叫声| mm131国产精品无码久久|