博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
五分钟入门 Dingo API
阅读量:5057 次
发布时间:2019-06-12

本文共 7259 字,大约阅读时间需要 24 分钟。

基于 文档更简洁的描述Dingo,直戳重点,注重实践

概述

Dingo API帮助您轻松快速地构建自己的API。虽然这个方案的目标是尽可能保持灵活性,但它仍然不能涵盖所有情况并解决所有问题。

安装

将以下代码加入到composer.json中,并执行composer update 或 composer install

"require": {    "dingo/api": "2.0.0-alpha1"}

Laravel

发布配置文件,执行此命令后会在config目录下生成api.php配置文件

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"Lumen

Lumen

如果是你使用的lumen,因lumen没有vendor命令,请打开 bootstrap/app.php 并注册服务提供者:

$app->register(Dingo\Api\Provider\LumenServiceProvider::class);

Facade

API 自带了两个 Facade,你可以酌情使用。

Dingo\Api\Facade\API

这个是调度器的 Facade ,并提供了一些好用的辅助方法。

Dingo\Api\Facade\Route

你可以使用这个 Facade 来获取 API 的当前路由、请求、检查当前路由的名称等。

你可以在config/app.php aliases数组内注册Facade

'aliases' => [    ...    'API'          => Dingo\Api\Facade\API::class,    'ApiRoute'     => Dingo\Api\Facade\Route::class,],

配置

在.env文件中配置你的Dingo API

  • API_STANDARDS_TREE
  • API_SUBTYPE
  • API_PREFIX
  • API_VERSION
  • API_NAME
  • API_CONDITIONAL_REQUEST
  • API_STRICT
  • API_DEBUG
  • API_DEFAULT_FORMAT

API_STANDARDS_TREE

Standards Tree 标准树

  • 未注册的树(x)主要表示本地和私有环境
  • 私有树(prs)主要表示没有商业发布的项目
  • 供应商树(vnd)主要表示公开发布的项目

是一种概念上的东西,类似与git的分支,如果正常开发就按照 x,prs,vnd 的描述来填写即可。

API_SUBTYPE

在请求header中需要用到他

API_PREFIX

地址的前缀,如果不需要请填写 '/'

API_VERSION

接口的版本,填写后是默认访问的版本

API_NAME

接口的名称,用于生成api文档,其他地方不使用

API_CONDITIONAL_REQUEST

条件请求默认为开启状态,这有利于客户端的缓存机制在可能的情况下缓存 API 请求。

API_STRICT

强制每次请求必须带版本,既

Accept:application/vnd.{API_SUBTYPE}.v2+json

API_DEBUG

是否开启调试,开启后访问api会看到

API_DEFAULT_FORMAT

返回的类型,一般都是json

一个栗子

API_STANDARDS_TREE=vndAPI_SUBTYPE=cateringAPI_PREFIX=/API_VERSION=v1API_NAME="My API"API_CONDITIONAL_REQUEST=falseAPI_STRICT=falseAPI_DEBUG=trueAPI_DEFAULT_FORMAT=json

使用

这里与实际业务结合来讲解

表结构

member

CREATE TABLE `member` (  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `tel` bigint(20) DEFAULT NULL COMMENT '手机号码',  `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '登录密码',  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '账号状态 0:正常',  `created_at` timestamp NULL DEFAULT NULL,  `updated_at` timestamp NULL DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `member_tel_unique` (`tel`),  KEY `member_tel_status_index` (`tel`,`status`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

member_data

CREATE TABLE `member_data` (  `member_id` bigint(20) NOT NULL COMMENT '用户编码',  `sex` enum('0','1','2') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '性别 0=>女生 1=>男生 2=>未知',  `nick_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '姓名/昵称',  `img` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户头像',  `created_at` timestamp NULL DEFAULT NULL,  `updated_at` timestamp NULL DEFAULT NULL,  UNIQUE KEY `member_data_member_id_unique` (`member_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

新建一个路由

$api = app ('Dingo\Api\Routing\Router');$api->post ('user/register', 'App\Api\Controllers\UserController@register');});

创建自定义响应

<?php    namespace App\Api;        class Response    {        public static function success($data)        {            return [                'status_code' => 200,                'data'        => $data,            ];        }                public static function error($message = '')        {            return [                'status_code' => 0,                'message'     => $message,            ];        }                public static function return($statusCode, $message, $data = [])        {            return [                'status_code' => $statusCode,                'message'     => $message,                'data'        => $data,            ];        }    }

创建控制器

<?php    namespace App\Api\Controllers;        use App\Api\DingoController;    use App\Api\Response;    use App\Api\Services\UserService;    use Illuminate\Http\Request;        class UserController extends DingoController    {        public $request;                protected $userService;                public function __construct(Request $request, UserService $userService)        {            $this->request = $request;                        $this->userService = $userService;        }                public function register()        {            $result = $this->userService->register ($this->request->all ());                        if ($result['status_code'] == 200) {                return $this->response->array (Response::return (200, '注册成功', [                    'user_id' => $result['data'],                ]));            }                        return $this->response->error ($result['message'], 500);        }    }

创建服务

<?php    namespace App\Api\Services;        use App\Api\Actions\CreateUser;    use App\Api\Response;    use App\Models\Member;        class UserService    {        public $member;                public function __construct(Member $member)        {            $this->member = $member;        }                public function register($data)        {            try {                return Response::success ((new CreateUser())->execute ($data));            } catch (\Exception $e) {                return Response::error ($e->getMessage ());            }        }    }

创建动作

<?php    namespace App\Api\Actions;        use App\Models\Member;    use App\Models\MemberData;        class CreateUser    {        /**         * @param array $data         *         * @return mixed         * @throws \Exception         */        public function execute(array $data)        {                        $member           = new Member();            $member->tel      = $data['tel'];            $member->password = md5 ($data['password']);            $result           = $member->save ();                        if (!$result) {                throw new \Exception('注册失败');            }                        $memberData            = new MemberData();            $memberData->member_id = $member->id;            $memberData->sex       = "2";            $memberData->nick_name = "";            $memberData->img       = "";            $memberData->save ();                        return $member->id;        }    }

请求

<?php$curl = curl_init();curl_setopt_array($curl, array(  CURLOPT_URL => "http://api.c.com/user/register",  CURLOPT_RETURNTRANSFER => true,  CURLOPT_ENCODING => "",  CURLOPT_MAXREDIRS => 10,  CURLOPT_TIMEOUT => 30,  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,  CURLOPT_CUSTOMREQUEST => "POST",  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tel\"\r\n\r\n18510362698\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\nzjk1221\r\n-----011000010111000001101001--",  CURLOPT_HTTPHEADER => array(    "accept: application/vnd.catering.v1+json",    "cache-control: no-cache",    "content-type: multipart/form-data; boundary=---011000010111000001101001",    "postman-token: e7cf665f-3698-217a-cd71-35c3a44f42bc"  ),));$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) {  echo "cURL Error #:" . $err;} else {  echo $response;}

疑难杂症

列出一些常见问题及解决方案

版本区分后如何访问

API_VERSION 设置的版本只是默认访问版本,如果想访问其他版本,需在header内添加

Accept:application/vnd.{API_SUBTYPE}.v2+json

不想添加前缀怎么办

API_PREFIX=/

API_PREFIX不能为空,必须填写内容,那理所当然的/一定是正确的

致谢

感谢你看到这里,以上为个人研究开发的总结以及代码,如果可以帮到你,我很高兴。如果有什么问题或者文章有哪些错误,请在评论区回复,及时阻止我误导他人。谢谢

原文地址:https://segmentfault.com/a/1190000015468101

转载于:https://www.cnblogs.com/lalalagq/p/9998493.html

你可能感兴趣的文章
java string(转)
查看>>
__all__有趣的属性
查看>>
BZOJ 5180 [Baltic2016]Cities(斯坦纳树)
查看>>
写博客
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
ios封装静态库技巧两则
查看>>
Educational Codeforces Round 46 (Rated for Div. 2)
查看>>
Abstract Factory Pattern
查看>>
C# 实现Bresenham算法(vs2010)
查看>>
基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
查看>>
list 容器 排序函数.xml
查看>>
存储开头结尾使用begin tran,rollback tran作用?
查看>>
Activity启动过程中获取组件宽高的五种方式
查看>>
java导出Excel表格简单的方法
查看>>
SQLite数据库简介
查看>>
利用堆实现堆排序&amp;优先队列
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>