基於 https://laravel-china.org/docs/dingo-api/2.0.0 文檔更簡潔的描述Dingo,直戳重點,注重實踐php
Dingo API幫助您輕鬆快速地構建本身的API。雖然這個方案的目標是儘量保持靈活性,但它仍然不能涵蓋全部狀況並解決全部問題。laravel
將如下代碼加入到composer.json中,並執行composer update 或 composer installgit
"require": { "dingo/api": "2.0.0-alpha1" } 複製代碼
發佈配置文件,執行此命令後會在config目錄下生成api.php配置文件json
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider" Lumen 複製代碼
若是是你使用的lumen,因lumen沒有vendor命令,請打開 bootstrap/app.php 並註冊服務提供者:bootstrap
$app->register(Dingo\Api\Provider\LumenServiceProvider::class); 複製代碼
API 自帶了兩個 Facade,你能夠酌情使用。api
Dingo\Api\Facade\API
複製代碼
這個是調度器的 Facade ,並提供了一些好用的輔助方法。數組
Dingo\Api\Facade\Route
複製代碼
你可使用這個 Facade 來獲取 API 的當前路由、請求、檢查當前路由的名稱等。緩存
你能夠在config/app.php aliases數組內註冊Facadebash
'aliases' => [ ... 'API' => Dingo\Api\Facade\API::class, 'ApiRoute' => Dingo\Api\Facade\Route::class, ], 複製代碼
在.env文件中配置你的Dingo APImarkdown
Standards Tree 標準樹
在請求header中須要用到他
地址的前綴,若是不須要請填寫 '/'
接口的版本,填寫後是默認訪問的版本
接口的名稱,用於生成api文檔,其餘地方不使用
條件請求默認爲開啓狀態,這有利於客戶端的緩存機制在可能的狀況下緩存 API 請求。
強制每次請求必須帶版本,既
Accept:application/vnd.{API_SUBTYPE}.v2+json
複製代碼
是否開啓調試,開啓後訪問api會看到
返回的類型,通常都是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 複製代碼
這裏與實際業務結合來說解
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; 複製代碼
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不能爲空,必須填寫內容,那理所固然的/
必定是正確的
感謝你看到這裏,以上爲我的研究開發的總結以及代碼,若是能夠幫到你,我很高興。若是有什麼問題或者文章有哪些錯誤,請在評論區回覆,及時阻止我誤導他人。謝謝