五分鐘入門 Dingo API

基於 https://laravel-china.org/doc... 文檔更簡潔的描述Dingo,直戳重點,注重實踐 Django-Book

概述

Dingo API幫助您輕鬆快速地構建本身的API。雖然這個方案的目標是儘量保持靈活性,但它仍然不能涵蓋全部狀況並解決全部問題。php

安裝

將如下代碼加入到composer.json中,並執行composer update 或 composer installhtml

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

Laravel

發佈配置文件,執行此命令後會在config目錄下生成api.php配置文件laravel

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

Lumen

若是是你使用的lumen,因lumen沒有vendor命令,請打開 bootstrap/app.php 並註冊服務提供者:git

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

Facade

API 自帶了兩個 Facade,你能夠酌情使用。json

Dingo\Api\Facade\API

這個是調度器的 Facade ,並提供了一些好用的輔助方法。bootstrap

Dingo\Api\Facade\Route

你可使用這個 Facade 來獲取 API 的當前路由、請求、檢查當前路由的名稱等。segmentfault

你能夠在config/app.php aliases數組內註冊Facadeapi

'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

相關文章
相關標籤/搜索