zoukankan      html  css  js  c++  java
  • Laravel Api Documentation

    如何生成api的使用文档:

    比如Blogger的Api这样的:

    批注 2020-04-15 014109

    方便你的用户来阅读使用。

    参考:https://laravel-apidoc-generator.readthedocs.io/en/latest/index.html

    执行:

    composer require mpociot/laravel-apidoc-generator

    批注 2020-04-15 141426

    执行:

    php artisan vendor:publish --provider="MpociotApiDocApiDocGeneratorServiceProvider" --tag=apidoc-config

    批注 2020-04-15 141552

    参考Generating Documentation

    执行:

    php artisan apidoc:generate

    批注 2020-04-15 141733

    生成的文件位置:

    批注 2020-04-15 141903

    浏览器打开:http://laravelauth.test/docs/ 即可查看

    批注 2020-04-15 142041

    修改测试:

    批注 2020-04-15 142444

    修改 Welcome to the generated API reference. 为 欢迎来到Api文档 。

    然后参考Manually modifying the content of the generated documentation   执行:

    php artisan apidoc:rebuild

    批注 2020-04-15 142716

    效果如下:

    批注 2020-04-15 142652

    接下来参考:Documenting Your API

    要给控制器分组,我们在目标控制器类前添加:

    /**
     * @group User management
     *
     * APIs for managing users
     */

    @group是必须的,文本就自定义了。

    比如在TaskController之前我们定义:

    批注 2020-04-15 143432

    修改完成后,执行

    php artisan apidoc:generate

    批注 2020-04-15 143705

    接着打开http://laravelauth.test/docs/即可看到:

    批注 2020-04-15 143824

    多出来一个叫做 Tasks management 的分组,注解为 APIs for managing tasks。

    接下来参考 Specifying request parameters 对TaskController里面的方法进行注解;

    store方法:

    参考在postman中发送的参数要求

    批注 2020-04-15 144858

    最好是看migration

    批注 2020-04-15 145036

    我们需要的body参数有:title【必须】description,due其余的都是可选的。

    所以添加:

    @bodyParam title string required 任务的标题. Example: 处理剩余的什麽.
    

    其余的可选的就不用required,类型按照需要的类型提供即可

    @bodyParam description text 任務的描述. Example:描述這個任務是做什麽
    @bodyParam due string 任務的截至日.Example: next monday

    然后执行:

    php artisan apidoc:generate

    打开 http://laravelauth.test/docs/ 查看:

    批注 2020-04-15 145942

    剩余的方法如何写就不再讲述。

    摘一段官方讲解:

    Specifying request parameters


    To specify a list of valid parameters your API route accepts, use the @urlParam, @bodyParam and @queryParam annotations.

    The @urlParam annotation is used for describing parameters in your URl. For instance, in a Laravel route with this URL: “/post/{id}/{lang?}”, you would use this annotation to describe the id and lang parameters. It takes the name of the parameter, an optional “required” label, and then its description.
    The @queryParam annotation takes the name of the parameter, an optional “required” label, and then its description.
    The @bodyParam annotation takes the name of the parameter, its type, an optional “required” label, and then its description.

    response注解:

    store方法

    参考:Providing an example response

    批注 2020-04-15 150905

    返回的内容可以复制postman的结果

    批注 2020-04-15 151346

    修改一下:

    * @response {
    *  "data": {
    *      "title": "due task",
    *      "description": "task with due date",
    *      "due": "2020-04-19 00:00:00",
    *      "user_id": 1,
    *      "updated_at": "2020-04-14T07:20:02.000000Z",
    *      "created_at": "2020-04-14T07:20:02.000000Z",
    *      "id": 11,
    *      "user": {
    *          "id": 1,
    *          "name": "user",
    *          "email": "user@user.com",
    *          "email_verified_at": null,
    *          "created_at": "2020-04-14T05:42:55.000000Z",
    *          "updated_at": "2020-04-14T05:42:55.000000Z",
    *          "deleted_at": null
    *    }
    *  }
    * }
    
    /**
     * Store a newly created task in storage.
     * @bodyParam title string required 任务的标题. Example: 处理剩余的什麽
     * @bodyParam description text 任務的描述. Example:描述這個任務是做什麽
     * @bodyParam due string 任務的截至日.Example: next monday
     * @param IlluminateHttpRequest $request
     * @response {
     *  "data": {
     *      "title": "due task",
     *      "description": "task with due date",
     *      "due": "2020-04-19 00:00:00",
     *      "user_id": 1,
     *      "updated_at": "2020-04-14T07:20:02.000000Z",
     *      "created_at": "2020-04-14T07:20:02.000000Z",
     *      "id": 11,
     *      "user": {
     *          "id": 1,
     *          "name": "user",
     *          "email": "user@user.com",
     *          "email_verified_at": null,
     *          "created_at": "2020-04-14T05:42:55.000000Z",
     *          "updated_at": "2020-04-14T05:42:55.000000Z",
     *          "deleted_at": null
     *    }
     *  }
     * }
     */
    public function store(Request $request)
    {
        $validated = Validator::make($request->all(), [
            'title' => 'required|max:255',
        ]);
        if ($validated->fails()) {
            return response($validated->errors()->all());
        }
        $input = $request->all();
        if ($request->has('due')) {
            $input['due'] = Carbon::parse($request->get('due'))->toDateTimeString();
        }
        $task = auth()->user()->tasks()->create($input);
    
        return new TaskResource($task->load('user'));
    }
    

    执行:

    php artisan apidoc:generate

    打开 http://laravelauth.test/docs/ 查看:

    批注 2020-04-15 151603

    其余的参考Providing an example response

    如果有apiResource的 虽然可以自己生成,但是并不完整。建议采用 @responseFile


    <?php
    
    namespace AppHttpControllers;
    
    use AppHttpResourcesTaskResource;
    use AppTask;
    use IlluminateHttpRequest;
    use IlluminateSupportCarbon;
    use IlluminateSupportFacadesValidator;
    
    /**
     * @group Tasks management
     *
     * APIs for managing tasks
     */
    class TaskController extends Controller
    {
        /**
         * Display a listing of the tasks.
         *
         * @return IlluminateHttpResponse
         */
        public function index()
        {
            //
            $tasks = TaskResource::collection(auth()->user()->tasks()->with('user')->latest()->paginate(4));
            return response($tasks, 200);
        }
    
        /**
         * Store a newly created task in storage.
         * @bodyParam title string required 任务的标题. Example: 处理剩余的什麽
         * @bodyParam description text 任務的描述. Example:描述這個任務是做什麽
         * @bodyParam due string 任務的截至日.Example: next monday
         * @param IlluminateHttpRequest $request
         * @response {
         *  "data": {
         *      "title": "due task",
         *      "description": "task with due date",
         *      "due": "2020-04-19 00:00:00",
         *      "user_id": 1,
         *      "updated_at": "2020-04-14T07:20:02.000000Z",
         *      "created_at": "2020-04-14T07:20:02.000000Z",
         *      "id": 11,
         *      "user": {
         *          "id": 1,
         *          "name": "user",
         *          "email": "user@user.com",
         *          "email_verified_at": null,
         *          "created_at": "2020-04-14T05:42:55.000000Z",
         *          "updated_at": "2020-04-14T05:42:55.000000Z",
         *          "deleted_at": null
         *    }
         *  }
         * }
         * @response 401 {
         *  "message":"The field is required."
         * }
         */
        public function store(Request $request)
        {
            $validated = Validator::make($request->all(), [
                'title' => 'required|max:255',
            ]);
            if ($validated->fails()) {
                return response($validated->errors()->all(), 401);
            }
            $input = $request->all();
            if ($request->has('due')) {
                $input['due'] = Carbon::parse($request->get('due'))->toDateTimeString();
            }
            $task = auth()->user()->tasks()->create($input);
    
            return new TaskResource($task->load('user'));
        }
    
        /**
         * Display the specified resource.
         * @urlParam task int required The ID of the task.
         * @response {
         *  "data": {
         *      "title": "due task",
         *      "description": "task with due date",
         *      "due": "2020-04-19 00:00:00",
         *      "user_id": 1,
         *      "updated_at": "2020-04-14T07:20:02.000000Z",
         *      "created_at": "2020-04-14T07:20:02.000000Z",
         *      "id": 11,
         *      "user": {
         *          "id": 1,
         *          "name": "user",
         *          "email": "user@user.com",
         *          "email_verified_at": null,
         *          "created_at": "2020-04-14T05:42:55.000000Z",
         *          "updated_at": "2020-04-14T05:42:55.000000Z",
         *          "deleted_at": null
         *    }
         *  }
         * }
         *
         * @response 404 {
         *  "message":"Not Found"
         * }
         */
        public function show(Task $task)
        {
            //
            return new TaskResource($task->load('user'));
        }
    
        /**
         * Update the specified resource in storage.
         * @urlParam task int required The ID of the task.
         * @bodyParam title string required 任务的标题. Example: 处理剩余的什麽
         * @bodyParam description text 任務的描述. Example:描述這個任務是做什麽
         * @bodyParam due string 任務的截至日.Example: next monday
         * @response {
         *  "data": {
         *      "title": "due task",
         *      "description": "task with due date",
         *      "due": "2020-04-19 00:00:00",
         *      "user_id": 1,
         *      "updated_at": "2020-04-14T07:20:02.000000Z",
         *      "created_at": "2020-04-14T07:20:02.000000Z",
         *      "id": 11,
         *      "user": {
         *          "id": 1,
         *          "name": "user",
         *          "email": "user@user.com",
         *          "email_verified_at": null,
         *          "created_at": "2020-04-14T05:42:55.000000Z",
         *          "updated_at": "2020-04-14T05:42:55.000000Z",
         *          "deleted_at": null
         *    }
         *  }
         * }
         *
         * @response 404 {
         *  "message":"Not Found"
         * }
         * @response 401 {
         *  "message":"The field is required."
         * }
         *
         * @response 422 {
         *  "message": "No permission!"
         * }
         * @param IlluminateHttpRequest $request
         *
         *
         */
        public function update(Request $request, Task $task)
        {
            //
            $validated = Validator::make($request->all(), [
                'title' => 'required|max:255',
            ]);
            if ($validated->fails()) {
                return response($validated->errors()->all());
            }
    
            if (!auth()->user()->tasks->contains($task)) {
                return response('No permission!', 422);
            }
            $input = $request->all();
    
            if ($request->has('due')) {
                $input['due'] = Carbon::parse($request->get('due'))->toDateTimeString();
            }
            $task->update($input);
    
            return new TaskResource($task->load('user'));
    
        }
    
        /**
         * Remove the specified resource from storage.
         * @urlParam task int required The ID of the task.
         * @response {
         *  "message": "Success deleted!"
         *  }
         * @response 404 {
         *  "message":"Not Found"
         * }
         * @return IlluminateHttpResponse
         */
        public function destroy(Task $task)
        {
            //
            if (!auth()->user()->tasks->contains($task)) {
                return response('No permission!', 422);
            }
            $task->delete();
    
            return response(['message' => 'Success deleted!']);
        }
    }
    
    

    当前生成的文档:

    批注 2020-04-15 222844

    包含这个general的我们并不需要。

    如果需要在生成的时候,只生成api的 在apidoc.php中做如下修改:

    修改前:

    批注 2020-04-15 222953

    修改后:

    批注 2020-04-15 223202

    执行:

    php artisan apidoc:generate

    批注 2020-04-15 223257

    然后打开http://laravelauth.test/docs/ 可以看到general 没有了,只有route路由为api/task对应的Controller【即:TaskController】生成了文档:

    批注 2020-04-15 223423

  • 相关阅读:
    python基础练习题(题目 学习使用auto定义变量的用法)
    python基础练习题(题目 模仿静态变量的用法)
    roaring bitmap 与 bitmap 比较. 编译运行
    Linux 实现开关机测试,记录开机次数
    Linux 显示开机欢迎信息(/etc/issue 与 /etc/motd)
    Linux 修改文件权限概述
    把编译好的程序放在Linux系统里,实现不需要配置程序和动态库的环境变量,直接执行
    Linux 提示 is not a symbolic link 错误解决方法
    Ubuntu 自动更新详解【转】
    C#线程入门
  • 原文地址:https://www.cnblogs.com/dzkjz/p/12702701.html
Copyright © 2011-2022 走看看