Laravel+Dingo/Api 自定義響應

在最近的開發開發項目中,我使用了Dingo/Api這個第三方Api庫。
Dingo是個很強大的Api庫, 但在開發的過程當中,須要自定義響應字段。php

剛開始使用Ding/Api時,返回以下:json

{
    "message": "422 Unprocessable Entity",
    "errors": {
        "mobile": [
            "手機號格式不正確"
        ]
    },
    "status_code": 422
}

這是輸入字段驗證錯誤時,Dingo返回的結果。api

這樣看上去沒什麼問題。由於這邊 status_code 是比較規範的。對於 PHP 來講,直接 json_decode 以後,並無什麼難辦的地方。可是對面安卓和 IOS 則是使用的強類型語言。尤爲是 Java,須要對每個 Json 對象進行新建,而後序列化。因此,這種格式不統一的返回結果,是沒法接受的

解決方法: 咱們須要將全部的異常信息歸總到一個地方,在AppServiceProviderboot()方法中添加app

// 將全部的 Exception 所有交給 App\Exceptions\Handler 來處理
app('api.exception')->register(function (Exception $exception) {
    $request = Illuminate\Http\Request::capture();
    return app('App\Exceptions\Handler')->render($request, $exception);
});

而後在App\Exceptions\Handler.php中的render()方法中:ide

$class = get_class($exception);
switch ($class) {
    case 'Dingo\Api\Exception\ValidationHttpException':
        if ($request->expectsJson())
            return $this->errorRespond($exception->getErrors()->first(), $exception->getStatusCode());
        break;

    default:
        if ($request->expectsJson())
            return $this->errorRespond('系統休息了', 500000);

        break;
}

再次訪問接口:this

{
    "response_status_code": 422,
    "response_message": "請填寫手機號",
    "data": []
}
相關文章
相關標籤/搜索