五分钟入门 Dingo API
基于 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="Dingo\Api\Provider\LaravelServiceProvider" LumenLumen
如果是你使用的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+jsonAPI_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'); });創建自定義響應
<?phpnamespace 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,];}}創建控制器
<?phpnamespace 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);}}創建服務
<?phpnamespace 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 ());}}}創建動作
<?phpnamespace 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不能為空,必須填寫內容,那理所當然的/一定是正確的
致謝
感謝你看到這里,以上為個人研究開發的總結以及代碼,如果可以幫到你,我很高興。如果有什么問題或者文章有哪些錯誤,請在評論區回復,及時阻止我誤導他人。謝謝
總結
以上是生活随笔為你收集整理的五分钟入门 Dingo API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赛腾股份是做什么的
- 下一篇: pandas的to_csv()使用细节和