基于 https://laravel-china.org/doc... 文档更简洁的描述Dingo,直戳重点,注重实践
Django-Book

概述

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=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 ('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

五分钟入门 Dingo API的更多相关文章

  1. kafka原理和实践(一)原理:10分钟入门

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  2. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

  3. JavaScript 10分钟入门

    JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...

  4. 十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))

    十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的 ...

  5. 正则表达式30分钟入门教程<转载>

    来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了 ...

  6. laravel5.5 dingo/api+jwt-auth

    因为laravel5.5 具有发现包功能,只要包做了兼容laravel5.5就可以不用在config/app.php添加额外代码了. 集成dingo/api github:https://github ...

  7. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

  8. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  9. 五分钟完成 ABP vNext 通讯录 App 开发

    五分钟完成 ABP vNext 通讯录 App 开发 ABP vNext(后文简称Abp)是 Volo 公司堪称艺术品级的应用开发框架,它基于领域驱动设计(DDD)的思维,创新地采用了模块化的设计.A ...

随机推荐

  1. idea | SpringBoot项目热加载

    第一步: 在pom文件添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  2. 自定义收索View

    1 .h文件 @interface SearchNavView : UIView @property (nonatomic, copy) void(^cancleBtnBlock)(void); @p ...

  3. C#静态类、静态构造函数,类与结构体的比较

    一.静态类 静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass{    public stati ...

  4. Django (五) modeld进阶

    day 05 models进阶 1.models基本操作   django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框架里: 我们写的类表示数据库的表 ...

  5. 牛客网Java刷题知识点之什么是JSP、JSP有哪些优点、JSP的9大内置对象、JSP的四大域对象、JSP的四种范围

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21175&query=&asc= ...

  6. hihocoder1831 80 Days

    思路: 令p[i] = a[i] - b[i],p[i + n] = p[i](i = 1,2,...,n),则需要找出一段长度为n的连续序列使此序列的任一前缀和均大于-c.转化如下:首先求序列p的前 ...

  7. P1809 过河问题_NOI导刊2011提高(01)

    题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...

  8. JavaScript之执行环境及作用域

        执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.我们编写的代码是无法访问这个对象的,但解 ...

  9. iOS之创建CocoaPods公有库教程

    简介 在开发过程中,经常会使用到第三框架,我们通过一个pod install命令,很方便的就将第三方框架加到我们自己的项目中. 如果我们也想将自己写的组件或库开源出去,让别人也可以通过pod inst ...

  10. SVN提交文件冲突怎么办?

    SVN文件遇到冲突怎么解决: 1. 文件出现这个图标提示后,你先把这个文件备份,备份到其他目录. 2. 把SVN目录下的这个文件还原为服务器上的最新版本或者直接删除重新更新到最新版本. 3. 把你备份 ...