Dingo Api 1.0在laravel5.2中的简单应用

Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集能够帮助开发者快速构建APIDingo Api最新的版本是2.0.0-alpha1,这个版本须要php7.0以上的php版本的支撑,笔者这里以Dingo Api 1.0为例简单介绍其在laravel5.2中的应用。

安装Dingo Api

  • composer.json中的require中添加"dingo/api": "1.0.*@dev"php

     
    composer.json

     

  • 执行composer updatelaravel

     
    composer update

     

配置Dingo Api

  • config/app.phpproviders中增长Dingo\Api\Provider\LaravelServiceProvider::class,
  • 执行php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"以生成config下配置文件
     
    vendor:publish
  • config/app.phpaliases中添加'Api' => Dingo\Api\Facade\API::class,
  • 配置config/api.php
    须要配置的内容以下:
'standardsTree' => env('API_STANDARDS_TREE', 'vnd'), // 项目须要能被公开访问 'subtype' => env('API_SUBTYPE', 'blog'), // 根据项目名称配置 'prefix' => env('API_PREFIX', 'api'), // 能够根据需求去设置 这里设置成api 'name' => env('API_NAME', 'Blog Api'), // 根据项目设置 'debug' => env('API_DEBUG', true), // 开启调试便于开发 上线后关闭之 

建立API路由

  • 建立App\Http\Controllers\Api\V1\UserController.phpjson

     
    建立控制器

     

  • 建立API路由器api

// 在app/Http/routes.php中增长 $api = app('Dingo\Api\Routing\Router'); 
  • 建立以版本为单位的路由组
// 在app/Http/routes.php中增长 $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 }); 
  • 生成URL
// 在app/Http/routes.php中增长 app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id'); 
  • 最终代码概览
// 在app/Http/routes.php中增长 $api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 }); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id'); 
  • 在控制台查看路由数组


     
    查看路由

建立API并访问

  • 完善App\Http\Controllers\Api\V1\UserController
    添加代码以下:
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; // 这里能够去掉没用的内容 use App\User; // 引用模型 class UserController extends Controller { public function show($id) // 接口方法 { return User::findOrFail($id); } } 
  • 访问接口php7


     
    访问接口

响应构建器

经过响应构建器能够构建更多自定义响应。app

  • 建立基类composer


     
    建立基类
  • 填充基类内容
    具体代码以下:curl

<?php namespace App\Http\Controllers\Api\V1; // 自动生成的内容能够去掉 use Dingo\Api\Routing\Helpers; // trait use Illuminate\Routing\Controller; // 增长 class BaseController extends Controller { use Helpers; } 
  • 继承基类
    修改App\Http\Controllers\Api\V1\UserController为:
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Api\V1\BaseController; // 此处有调整 use App\User; // 引用模型 class UserController extends BaseController // 此处有调整 { public function show($id) // 接口方法 { return User::findOrFail($id); } } 
  • 数组响应
    修改接口代码为:
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->array($user->toArray()); } 

增长一个获取所有用户数据的接口

  • 修改路由
$api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 $api->get('user', ['as' => 'user.index', 'uses' => 'App\Http\Controllers\Api\V1\UserController@index']); // 注意此处controller要写完整命名空间 增长行 }); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id'); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.index'); // 增长行 
  • 增长接口
    App\Http\Controllers\Api\V1\UserController增长方法:
public function index() { return User::all(); } 
 
user.index
  • 数组响应
    修改App\Http\Controllers\Api\V1\UserControllerindex方法:
public function index() { $users = User::all(); return $this->response->array($users->toArray()); } 
 
数组响应

构建转换器

转换器用于对数据进行过滤和转化用以提供更加人性化的数据。ide

  • 添加App\Transformers\Api\V1\UserTransformer.php
    具体代码以下:
<?php namespace App\Transformers\Api\V1; use League\Fractal\TransformerAbstract; use App\User; class UserTransformer extends TransformerAbstract { public function transform(User $user) { return [ 'name' => $user->name, 'email' => $user->email, 'created_at' => date('Y-m-d', strtotime($user->created_at)) ]; } } 
  • 使用转换器
    修改App\Http\Controllers\Api\V1\UserController
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Api\V1\BaseController; use App\Transformers\Api\V1\UserTransformer; // 增长行 use App\User; // 引用模型 class UserController extends BaseController { public function index() { $users = User::all(); return $this->response->array($users->toArray()); } public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer); //修改 } } 
 
transformer user.show

实现分页

  • 执行php artisan make:seeder UsersTableSeeder

     
    make:seeder

     

  • 修改database\seeds\UsersTableSeeder.php

<?php use Illuminate\Database\Seeder; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { factory(App\User::class, 50)->create(); // 增长一行 } } 
  • 执行php artisan db:seed --class=UsersTableSeeder

     
    db:seed

     
    users

     

  • 修改App\Http\Controllers\Api\V1\UserControllerindex方法:

public function index() { $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); } 
 
paginate user.index

更多响应

  • 指定信息和状态码的错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->error('This is an error.', 404); } 
 
指定信息和状态码的错误响应
  • 未找到错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorNotFound(); } 
 
未找到错误响应
  • 坏请求错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorBadRequest(); } 
 
坏请求错误响应
  • 禁止访问错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorForbidden(); } 
 
禁止访问错误响应
  • 内部错误错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorInternal(); } 
 
内部错误错误响应
  • 未认证错误响应
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorUnauthorized(); } 
 
未认证错误响应
  • 添加响应头
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->withHeader('author', 'stone'); } 
 
添加响应头
  • 添加元数据
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->addMeta('author', 'stone'); } 
 
添加元数据
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->setMeta(['author' => 'stone', 'date' => date('Y-m-d')]); } 
 
添加多个元数据
  • 设置响应状态码
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->setStatusCode(202); } 
 
设置响应状态码

为接口增长权限控制

这一步须要提供oAuth的支持,可参考oAuth2.0在laravel5.2中的简单应用

  • 在路由定义上加入oAuth中间件
$api->version('v1', ['middleware' => 'oauth'], function ($api) { // 加上中间件 $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 $api->get('user', ['as' => 'user.index', 'uses' => 'App\Http\Controllers\Api\V1\UserController@index']); // 注意此处controller要写完整命名空间 }); 
  • 获取access_token
    建立能够经过http://www.test.com/test.php访问的脚本,内容以下:
function post($url, $param){ $oCurl = curl_init(); $aPOST = []; foreach($param as $key=>$val){ $aPOST[] = $key.'='.urlencode($val); } $strPOST = join('&', $aPOST); curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(200 == intval($aStatus['http_code'])){ return $sContent; }else{ return false; } } $server = 'http://localhost:8000/oauth/access_token'; $params = [ 'grant_type' => 'password', 'username' => 'admin@admin.com', 'password' => '123456', 'client_id' => 'shy7jf8fa93d59c45502c0ae8chj76s', 'client_secret' => 'bc7f6f8fa93d59c45502c0ae8c4a95d', ]; echo post($server, $params); 
 
获取access_token
  • 访问须要受权的接口


     
    不带access_token访问
 
带错误的access_token访问
 
带正确的access_token访问

本文首发于公众号:programmer_cc,转载请注明出处。

相关文章
相关标签/搜索