3.2. 统一接口返回值处理

未匹配的标注

简要说明

通过查阅资料,并且结合前后端对接习惯来看,我们希望,api的返回信息应该包含以下四个信息:

- status         状态信息「成功或失败」
- code           http状态码
- message        提示信息
- data           返回数据信息

下面的内容也将按照此格式进行编写。

创建 ApiResponse.php 文件

app/API/Helpers 目录 (不存在目录自己新建) 下新建 ApiResponse.php
填入内容如下:

<?php
namespace App\API\Helpers;
use Symfony\Component\HttpFoundation\Response as FoundationResponse;

trait ApiResponse
{
    /**
     * 拦截http状态码
     * @var int
     */
    protected $statusCode = FoundationResponse::HTTP_OK;

    /**
     * @return mixed
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }

    /**
     * @param $statusCode
     * @return $this
     */
    public function setStatusCode($statusCode,$httpCode=null)
    {
        $httpCode = $httpCode ?? $statusCode;
        $this->statusCode = $statusCode;
        return $this;
    }

    /**
     * @param $data
     * @param string $status
     * @param $code
     * @return mixed
     */
    public function success($data,$code=null,$status = "success"){

        return $this->status($status,compact('data'),$code);
    }

    /**
     * @param $status
     * @param array $data
     * @param null $code
     * @return mixed
     */
    public function status($status, array $data, $code = null){

        if ($code){
            $this->setStatusCode($code);
        }
        $status = [
            'status' => $status,
            'code' => $this->statusCode,
        ];

        $data = array_merge($status,$data);
        return response()->json($data);

    }
    /**
     * @param $message
     * @param int $code
     * @param string $status
     * @return mixed
     */
    public function error(string $message, $code = FoundationResponse::HTTP_BAD_REQUEST,$status = 'error'){

        return $this->setStatusCode($code)->message($message,$status);
    }
    /**
     * @param $message
     * @param string $status
     * @return mixed
     */
    public function message($message, $status = "success"){

        return $this->status($status,[
            'message' => $message
        ]);
    }

    /**
     * @param string $message
     * @return mixed
     */
    public function notFound($message = 'Not Found!')
    {
        return $this->error($message,Foundationresponse::HTTP_NOT_FOUND);
    }
}

新建 Api 基类

app/Http/Controller/Api 目录下新建一个 Controller.php 作为 Api 专门的基类.
填入内容如下:

<?php

namespace App\Http\Controllers\Api;

use App\API\Helpers\ApiResponse;
use App\Http\Controllers\Controller as BaseController;

class Controller extends BaseController
{

    use ApiResponse;
    // 其他通用的Api帮助函数
}

注意:其他 Api 控制器应该继承基类控制器

如何使用

得益于前面统一消息的封装,使用起来非常容易。
1. 返回正确信息

return $this->success('用户登录成功...');

2. 返回正确资源信息

return $this->success($user);

3. 返回自定义 http 状态码的正确信息

return $this->success('用户登录成功...',401);

4. 返回错误信息

return $this->error('用户注册失败');

5. 返回自定义 http 状态码的错误信息

return $this->error('用户登录失败',401);

6. 返回自定义 http 状态码的错误信息,同时也想返回自己内部定义的错误码

return $this->error('用户登录失败',401,10001);

7. 返回404

return $this->notFound();

默认 success 返回的状态码是 200,error 返回的状态码是 400

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Jouzeyu
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~