摘要:虽然这个方案的目标是尽可能保持灵活性,但它仍然不能涵盖所有情况并解决所有问题。这个是调度器的,并提供了一些好用的辅助方法。如果有什么问题或者文章有哪些错误,请在评论区回复,及时阻止我误导他人。
基于 https://laravel-china.org/doc... 文档更简洁的描述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="DingoApiProviderLaravelServiceProvider" LumenLumen
如果是你使用的lumen,因lumen没有vendor命令,请打开 bootstrap/app.php 并注册服务提供者:
$app->register(DingoApiProviderLumenServiceProvider::class);Facade
API 自带了两个 Facade,你可以酌情使用。
DingoApiFacadeAPI
这个是调度器的 Facade ,并提供了一些好用的辅助方法。
DingoApiFacadeRoute
你可以使用这个 Facade 来获取 API 的当前路由、请求、检查当前路由的名称等。
你可以在config/app.php aliases数组内注册Facade
"aliases" => [
...
"API" => DingoApiFacadeAPI::class,
"ApiRoute" => DingoApiFacadeRoute::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_TREEStandards 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=vnd API_SUBTYPE=catering API_PREFIX=/ API_VERSION=v1 API_NAME="My API" API_CONDITIONAL_REQUEST=false API_STRICT=false API_DEBUG=true API_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 ("DingoApiRoutingRouter");
$api->post ("user/register", "AppApiControllersUserController@register");
});
创建自定义响应
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,
];
}
}
创建控制器
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);
}
}
创建服务
member = $member;
}
public function register($data)
{
try {
return Response::success ((new CreateUser())->execute ($data));
} catch (Exception $e) {
return Response::error ($e->getMessage ());
}
}
}
创建动作
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;
}
}
请求
"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
Content-Disposition: form-data; name="tel"
18510362698
-----011000010111000001101001
Content-Disposition: form-data; name="password"
zjk1221
-----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://www.ucloud.cn/yun/28960.html
摘要:我的博客中文文档中使用辅助文章参考这篇文章基本就能搭建出环境,我使用的版本跟他一样,不知道别的版本有啥大的区别,但是网上找的其他一些文章使用的是旧的版本,封装的东西路径可能不一样,可能会保错,有些文档还说要手动添加和,其实新版本不需要。 我的github博客:https://zgxxx.github.io/ dingo api 中文文档: https://www.bookstack....
摘要:快速使用安装添加服务提供者打开向数组中添加其他的服务提供者添加打开向数组中添加和其他的添加自定义配置文件执行命令结果配置你的文件,把下面的内容添加你的文件里到这里,基础配置基本完事了,下面创建一个来看看效果创建到你的路由文件里面,把下面 快速使用 安装 composer require dingo/api:1.0.x@dev 添加dingo服务提供者 打开 config/app.php...
摘要:源码使用本文使用的数据库与基础篇相同,故不再重复说明。使用的用法与之前的自定义用法类似,甚至更加简单。首先定义路由如果要查看路由,需要使用创建控制器需要使用这个。 源码 使用 Dingo Api 本文使用的数据库与基础篇相同,故不再重复说明。 初始化 安装 $ composer require dingo/api:1.0.x@dev 注册 /config/app.php provide...
摘要:在最近的开发开发项目中,我使用了这个第三方库。是个很强大的库,但在开发的过程中,需要自定义响应字段。刚开始使用时,返回如下手机号格式不正确这是输入字段验证错误时,返回的结果。尤其是,需要对每一个对象进行新建,然后序列化。 在最近的开发开发项目中,我使用了Dingo/Api这个第三方Api库。Dingo是个很强大的Api库, 但在开发的过程中,需要自定义响应字段。 刚开始使用Ding/A...
摘要:背景在近期使用处理接口时,发现本身中无法捕获异常。后来查阅资料发现,接管了请求的异常处理。导致无法自定义错误返回,很是头疼。最后在的找到了处理方法。 背景 在近期使用Dingo api处理接口时,发现laravel本身appExceptionsHandler中无法捕获异常。 后来查阅资料发现,Dingo api接管了api请求的异常处理。导致无法自定义错误返回,很是头疼。 最后在di...
阅读 2433·2019-08-30 15:53
阅读 2686·2019-08-30 12:54
阅读 1543·2019-08-29 16:09
阅读 899·2019-08-29 12:14
阅读 948·2019-08-26 10:33
阅读 2740·2019-08-23 18:36
阅读 3170·2019-08-23 18:30
阅读 2305·2019-08-22 17:09