api laravel 统一返回方法_Laravel-自定义API返回的JSON格式

本文介绍了如何在 Laravel 框架中实现API返回值的统一格式,包括使用Response Macro简化Controller返回、处理主动抛出的错误、自定义FormRequest验证失败响应以及处理未认证的用户请求。通过这些方法,可以确保HTTP请求后的JSON响应遵循预设的结构。
摘要由CSDN通过智能技术生成

按照我司规范,服务器处理http请求后返回的JSON,应该是这样的格式:

{

code:

data:

msg:

}

这就需要对Laravel框架默认的返回值(太随意了,缺少一个统一的结构来包装返回值)做一些处理,具体包括以下几个部分:

(一)使用LaravelResponse Macro机制来自Controller的直接返回

需要进行以下几步操作:

1、创建一个ServiceProvider

php artisan make:provider ResponseMacroServiceProvider

namespace App\Providers;

useIlluminate\Support\ServiceProvider;

useIlluminate\Support\Facades\Response;

class ResponseMacroServiceProvider extendsServiceProvider

{

public functionboot()

{

Response::macro('horesp', function ($code=2000, $data=null, $msg=null) {

$content = array(

'code' => $code,

'data' => $data,

'msg' => $msg);

return response()->json($content);

});

}

public functionregister()

{

//

}

}

2、在config/app.php文件中的‘providers’列表中,增加下面的一行

App\Providers\ResponseMacroServiceProvider::class,

3、创建一个HOBaseController,以后所有的Controller都继承这个类

php artisan make:controller HOBaseController

namespace App\Http\Controllers;

useApp\Http\Controllers\Controller;

class HOBaseController extendsController

{

//这个方法只应该在接口顺利完成了对请求业务的处理之后调用

public function response($data=null, $msg=null)

{

return response()->horesp(2000, $data, $msg);

}

}

4、以后在controller类里面直接返回结果时,使用这个方式

return $this->response($user->name);

(二)对主动返回的错误值做处理

原理是通过主动抛出异常,来处理所有需要返回错误代码和错误信息的情况,由框架的异常处理机制来构造最终的返回值。

1、创建一个HOException类

php artisan make:exception HOException

2、在App\Exception文件夹中,创建一个HOError.php文件,对每一个错误,都定义一个方法,供外部调用。

namespace App\Exceptions;

use \App\Exceptions\HOException asHOException;

classHOError

{

public functiongeneralErr()

{

throw new HOException('General Error Occurred', 2001);

}

}

3、在HOBaseController里面,增加如下代码

protected $error;

public functionerror()

{

$this->error = newHOError();

return $this->error;

}

4、在App/Exeption/Handler.php文件中,重写render方法

use Illuminate\Support\Facades\Log;

use \App\Exceptions\HOException asHOException;

useIlluminate\Http\Exceptions\HttpResponseException;

public function render($request, Exception $exception)

{

//对详细的错误信息,进行记录,但是不返回给前端

Log::debug( parent::render($request, $exception) );

if ( $exceptioninstanceof HOException ) {

$msg = $exception->getMessage();

}else{

$msg = 'Server Bad';

}

return response()->horesp( $exception->getCode(), null, $msg);

}

5、在Controller的方法里,可以这样来返回错误码和错误信息

return $this->error()->generalErr();

(三) 对Validate不通过的情况做处理

创建一个HOFormRequest类,继承FormRequest类,以后创建FormRequest,都从HOFormRequest类去集成. 解决方案来自:https://www.jianshu.com/p/658f979abfb7

namespace App\Http\Requests;

useIlluminate\Foundation\Http\FormRequest;

use App\Exceptions\HOException asHOException;

use Illuminate\Contracts\Validation\Validator asValidator;

class HOFormRequest extendsFormRequest

{

/**

* Determine if the user is authorized to make this request.

*

* @return bool

*/

public functionauthorize()

{

return true;

}

/**

* Get the validation rules that apply to the request.

*

* @return array

*/

public functionrules()

{

return[

//

];

}

protected function failedValidation(Validator $validator)

{

$message = $validator->errors()->all();

throw new HOException(implode($message), 3000);

}

}

(四)对Authenticate不通过情况的处理

1、创建一个unauthenticated路由,在对应的controller方法中返回标准格式的错误信息和字符串给客户端。

Route::post('/user/unauthenticated', 'Api\UserController@unauthenticated')->name('unauthenticated');

2、修改app\middleware\authenticate.php中间件的redirectTo方法

protected function redirectTo($request){return route('unauthenticated');

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值