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

来源:互联网 发布:湖北广电网络官网 编辑:程序博客网 时间:2024/05/20 22:04

dingo/api


安装

composer require dingo/api:1.0.x@dev

配置

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

...'providers' => [    ...    Dingo\Api\Provider\LaravelServiceProvider::class,    ...],...

生成配置文件config/api.php

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

设置.env

phpAPI_STANDARDS_TREE=vndAPI_SUBTYPE=biubiujunAPI_PREFIX=apiAPI_VERSION=v1API_NAME=BiuBiuJunAPI_CONDITIONAL_REQUEST=falseAPI_STRICT=falseAPI_DEFAULT_FORMAT=jsonAPI_DEBUG=true

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

创建UserTableSeeder

php artisan make:seeder UserTableSeeder

修改database/seeds/UserTableSeeder.php

<?phpuse 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();    }}

执行seeder

php artisan db:seed

创建UserController

php artisan make:controller Api/V1/UserController

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

<?phpnamespace 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);    }}

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');});

查看路由列表

php artisan api:routes

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

Passport


安装

composer require laravel/passport

配置

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

...'providers' => [    ...    Laravel\Passport\PassportServiceProvider::class,    ...],...

迁移Passport相关的数据表

php artisan migrate

修改app/User.php

<?phpnamespace App;use Laravel\Passport\HasApiTokens;use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable{    use HasApiTokens, Notifiable;}

创建AuthServiceProvider

php artisan make:provider AuthServiceProvider

修改app/Providers/AuthServiceProvider

<?phpnamespace 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();    }}

修改config/auth.php

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

创建一个密码发放客户端

php artisan passport:client --password

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

创建PassportDingoProvider

php artisan make:provider PassportDingoProvider

修改app/Providers/PassportDingoProvider.php

<?phpnamespace 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';    }}

修改config/api.php

...'auth' => [     'custom' => \App\Providers\PassportDingoProvider::class],...

修改App/Http/Kernel.php

...protected $middlewareGroups = [   ...   'api:auth' => [       'auth:api',       'api.auth'    ]    ...];...

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');});

测试

请求令牌

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

请求用户列表

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

Swagger


安装

composer require zircote/swagger-php

测试

创建SwaggerController

php artisan make:controller SwaggerController

修改app/Http/Controller/SwaggerController

<?phpnamespace 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);    }}

下载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";        }    ...

访问http://localhost/path/public/doc/

1 0