正确响应,也想在 response 时加入 code 字段,应该如何修改?

错误的时候,可以通过 HttpException,在返回错误信息中添加 code 字段。
如果是请求正确,我也想返回 code 字段,此时应该如何修改?我百度找了一下没有提及

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

跟我司的需求一样,我司的需求是不管成功失败,http_status 都是 200,一定要返回 code 和 message,成功 code 返回 0,失败 code 返回自定义 code 码。
然后我们的做法是异常建了一个异常类,laravel5.5 可以直接在自建的异常类渲染,就直接返回 code 和 message 了。
正确相应是,新建了一个 SuccessResource,在该 SuccessResource 中返回 code 和 message,

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Success extends Resource
{
    /**
     * @var array
     */
    protected $data;
    /**
     * 禁用顶层包裹
     *
     * @var null
     */
    public static $wrap = null;

    public function __construct($data = [], $resource = null)
    {
        $this->data = $data;

        if (is_null($resource)) {
            $resource = collect();
        }
        parent::__construct($resource);
    }

    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     *
     * @return array
     */
    public function toArray($request)
    {
        $success         = ['code' => 0, 'message' => 'success'];
        $success['data'] = array_has($this->data, 'data') ? $this->data['data'] : $this->data;

        if (array_has($this->data, 'meta')) {
            $success['meta'] = $this->data['meta'];
        }

        return $success;
    }
}

再在 helpers 中写一个 success () 方法,返回 SuccessResource。

if (!function_exists('success')) {
    function success($data = [])
    {
        return new \App\Http\Resources\Success($data);
    }
}

当然正确相应也分情况,操作成功是 return success ().
带有参数是 return success ($data);
用的 laravel5.5 + 的 apiResource,新建 BaseResource,添加 public $additional = ['code'=>0,'message'=>'success'];

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

abstract class BaseResource extends Resource
{
    /**
     * 成功返回添加code码
     * @var array
     */
    public $additional = [
        'code'=>0,
        'message'=>'success'
    ];

其他资源类继承该类,这样返回详情时 return new UserResource ($user); 会带 code 和 message。
列表和分页,我司的要求是返回 code、message、data、meta,meta 中是 4 个值,这样 meta 是要自己重新封装的,在封装 meta 时,将 code 和 message 一起写上就可以。
在 helpers 中封装 meta:

if (!function_exists('getPaginateMeta')) {
    function getPaginateMeta($obj)
    {
        return [
            'meta'    => [
                'total'        => $obj->total(),
                'per_page'     => (int)$obj->perPage(),
                'current_page' => $obj->currentPage(),
                'last_page'    => $obj->lastPage()
            ],
            'code'    => 0,
            'message' => 'success'
        ];
    }
}

然后返回分页写法是

return UserResource::collection(collect($index->items())) ->additional(getPaginateMeta($index));

当然最简单,也最不依赖,就是直接返回数组啦,return ['code'=>0,'message'=>'success'];

6年前 评论
h-o-o 5年前
aen233 (作者) 5年前
周小云 1年前
风吹枫落

可以选择手写或者包装一个 trait

7年前 评论

@风吹枫落 不会改。。。所以发出来请教

7年前 评论
风吹枫落

@XYD 介绍 看看这个能满足不

7年前 评论
liyu001989

REST 风格的接口,通过状态码判断就行,不建议在每个 body 中增加 code

7年前 评论

手动封装一个 trait 或可以考虑使用 Resources

return (new CateCollection($this->cate->page($page, $page_size, $query)->load('items')))->additional(['meta' => compact('total_nums', 'page_size', 'page')]);

得到结果

{
    title: {
        id: "序号",
        cate_name: "分类名",
        item_nums: "文章数",
        status: "显示",
        created_at: "创建时间",
        updated_at: "修改时间"
    },
    data: [
        {
            id: 1,
            cate_name: "测试一",
            status: true,
            item_nums: 8,
            created_at: "1 month ago",
            updated_at: "2018-03-01 06:27:58"
        }
    ],
    meta: {
        total_nums: 4,
        page_size: 1,
        page: 1
    }
}
7年前 评论

跟我司的需求一样,我司的需求是不管成功失败,http_status 都是 200,一定要返回 code 和 message,成功 code 返回 0,失败 code 返回自定义 code 码。
然后我们的做法是异常建了一个异常类,laravel5.5 可以直接在自建的异常类渲染,就直接返回 code 和 message 了。
正确相应是,新建了一个 SuccessResource,在该 SuccessResource 中返回 code 和 message,

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Success extends Resource
{
    /**
     * @var array
     */
    protected $data;
    /**
     * 禁用顶层包裹
     *
     * @var null
     */
    public static $wrap = null;

    public function __construct($data = [], $resource = null)
    {
        $this->data = $data;

        if (is_null($resource)) {
            $resource = collect();
        }
        parent::__construct($resource);
    }

    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     *
     * @return array
     */
    public function toArray($request)
    {
        $success         = ['code' => 0, 'message' => 'success'];
        $success['data'] = array_has($this->data, 'data') ? $this->data['data'] : $this->data;

        if (array_has($this->data, 'meta')) {
            $success['meta'] = $this->data['meta'];
        }

        return $success;
    }
}

再在 helpers 中写一个 success () 方法,返回 SuccessResource。

if (!function_exists('success')) {
    function success($data = [])
    {
        return new \App\Http\Resources\Success($data);
    }
}

当然正确相应也分情况,操作成功是 return success ().
带有参数是 return success ($data);
用的 laravel5.5 + 的 apiResource,新建 BaseResource,添加 public $additional = ['code'=>0,'message'=>'success'];

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

abstract class BaseResource extends Resource
{
    /**
     * 成功返回添加code码
     * @var array
     */
    public $additional = [
        'code'=>0,
        'message'=>'success'
    ];

其他资源类继承该类,这样返回详情时 return new UserResource ($user); 会带 code 和 message。
列表和分页,我司的要求是返回 code、message、data、meta,meta 中是 4 个值,这样 meta 是要自己重新封装的,在封装 meta 时,将 code 和 message 一起写上就可以。
在 helpers 中封装 meta:

if (!function_exists('getPaginateMeta')) {
    function getPaginateMeta($obj)
    {
        return [
            'meta'    => [
                'total'        => $obj->total(),
                'per_page'     => (int)$obj->perPage(),
                'current_page' => $obj->currentPage(),
                'last_page'    => $obj->lastPage()
            ],
            'code'    => 0,
            'message' => 'success'
        ];
    }
}

然后返回分页写法是

return UserResource::collection(collect($index->items())) ->additional(getPaginateMeta($index));

当然最简单,也最不依赖,就是直接返回数组啦,return ['code'=>0,'message'=>'success'];

6年前 评论
h-o-o 5年前
aen233 (作者) 5年前
周小云 1年前

return response ()->json ($content, 200); 这样就行了

4年前 评论