Laravel5.3开发API(Dingo+Passport+Swagger)

dingo/api


安装

composer require dingo/api:1.0.x@dev
  • 1

配置

config/app.php 注册服务提供者

...
'providers' => [
    ...
    Dingo\Api\Provider\LaravelServiceProvider::class,
    ...
],
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

生成配置文件config/api.php

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

设置.env

phpAPI_STANDARDS_TREE=vnd
API_SUBTYPE=biubiujun
API_PREFIX=api
API_VERSION=v1
API_NAME=BiuBiuJun
API_CONDITIONAL_REQUEST=false
API_STRICT=false
API_DEFAULT_FORMAT=json
API_DEBUG=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

API_STANDARDS_TREE - API规格 
x 本地或私有环境 
prs 非商业销售的项目 
vnd 公开的以及商业销售的项目

API_SUBTYPE - API简称 
API_PREFIX - API前缀(或使用API_DOMAIN - API子域名) 
API_VERSION - API默认版本 
API_NAME - API名称 
API_CONDITIONAL_REQUEST - 带条件的请求,由于缓存API请求的时候会使用客户端缓存功能,所以默认开启了带条件的请求 
API_STRICT - 严格模式,要求客户端发送Accept头而不是默认在配置文件中指定的版本 
API_DEFAULT_FORMAT - 响应格式,默认的响应格式是JSON 
API_DEBUG - 调试模式

测试

迁移User数据表

php artisan migrate
  • 1

创建UserTableSeeder

php artisan make:seeder UserTableSeeder
  • 1

修改database/seeds/UserTableSeeder.php

<?php
use Illuminate\Database\Seeder;

class UsesTableSeeder extends Seeder
{
    /**
      * Run the database seeds. 
      * 
      * @return void
      */
    public function run()
    {
        $user = new User();
        $user->name = 'BiuBiuJun';
        $user->email = 'biubiujun@163.com';
        $user->password = Hash::make('123456');
        $user->save();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

执行seeder

php artisan db:seed
  • 1

创建UserController

php artisan make:controller Api/V1/UserController
  • 1

修改app/Http/Controller/Api/V1/UserController

<?php
namespace App\Http\Controllers\Api\V1;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function index()
    {
        return User::all();
    }

    public function show($id)
    {
        return User::findOrFail($id);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

routes/api.php注册路由

...
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
    $api->get('user/{id}', 'UserController@show');
    $api->get('user', 'UserController@index');
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查看路由列表

php artisan api:routes
  • 1

访问即可 
http://localhost/path/public/api/user 
http://localhost/path/public/api/user/1

Passport


安装

composer require laravel/passport
  • 1

配置

config/app.php注册服务提供者

...
'providers' => [
    ...
    Laravel\Passport\PassportServiceProvider::class,
    ...
],
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

迁移Passport相关的数据表

php artisan migrate
  • 1

修改app/User.php

<?php
namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建AuthServiceProvider

php artisan make:provider AuthServiceProvider
  • 1

修改app/Providers/AuthServiceProvider

<?php

namespace App\Providers;

use Carbon\Carbon;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

        Passport::pruneRevokedTokens();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

修改config/auth.php

...
 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

创建一个密码发放客户端

php artisan passport:client --password
  • 1

配置Dingo使用Passport密码发放令牌

创建PassportDingoProvider

php artisan make:provider PassportDingoProvider
  • 1

修改app/Providers/PassportDingoProvider.php

<?php
namespace App\Providers;

use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Dingo\Api\Auth\Provider\Authorization;

class PassportDingoProvider extends Authorization
{
    public function authenticate(Request $request, Route $route)
    {
        return $request->user();
    }

    public function getAuthorizationMethod()
    {
        return 'bearer';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

修改config/api.php

...
'auth' => [ 
    'custom' => \App\Providers\PassportDingoProvider::class
],
...
  • 1
  • 2
  • 3
  • 4
  • 5

修改App/Http/Kernel.php

...
protected $middlewareGroups = [
   ...
   'api:auth' => [
       'auth:api',
       'api.auth'
    ]
    ...
];
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

routes/api.php修改之前注册路由

...
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['middleware' => 'api:auth', 'namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
    $api->get('user/{id}', 'UserController@show');
    $api->get('user', 'UserController@index');
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试

请求令牌

curl -d "username=biubiujun@163.com@password=123456@grant_type=password&client_id=<client_id>&client_secret=<client_secret>" http://localhost/path/public/api/oauth/token
  • 1

请求用户列表

curl -H "Authorization: Bearer <token>" http://localhost/path/public/api/user
  • 1

Swagger


安装

composer require zircote/swagger-php
  • 1

测试

创建SwaggerController

php artisan make:controller SwaggerController
  • 1

修改app/Http/Controller/SwaggerController

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;

/**
 * @SWG\Info(title="My First API", version="0.1")
 */

/**
 * @SWG\Get(
 *     path="/api/resource.json",
 *     @SWG\Response(response="200", description="An example resource")
 * )
 */
class SwaggerController extends Controller
{
    public function doc()
    {
        $swagger = \Swagger\scan(__DIR__ . '/../');

        return response()->json($swagger);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

下载swagger-ui 
swagger-ui 
swagger-ui/dist目录放入public/doc

修改public/doc/index.html

...
<script src='lang/translator.js' type='text/javascript'></script>
<script src='lang/zh-cn.js' type='text/javascript'></script>
<script type="text/javascript">
    $(function () {
      var url = window.location.search.match(/url=([^&]+)/);
        if (url && url.length > 1) {
          url = decodeURIComponent(url[1]);
        } else {
          // url = "http://petstore.swagger.io/v2/swagger.json"
          url = "/api/doc";
        }
    ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值