基于laravel制作API接口
關于api
API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。
需要注意的是:API有它的具體用途,我們應該清楚它是干啥的。訪問API的時候應該輸入什么。訪問過API過后應該得到什么。
在開始設計API時,我們應該注意這8點
后續的開發計劃就圍繞著這個進行了。
1.Restful設計原則
2.API的命名
3.API的安全性
4.API返回數據
5.圖片的處理
6.返回的提示信息
7.在線API測試文檔
8.在app啟動時,調用一個初始化API獲取必要的信息
用laravel開發API
就在我上愁著要不要從零開始學習的時候,找到了這個插件dingo/api那么現在就來安裝吧!
首先一定是下載的沒錯
在新安裝好的laravel的composer.json加入如下內容
然后打開cmd執行
composer update
在config/app.php中的providers里添加
AppProvidersOAuthServiceProvider::class, DingoApiProviderLaravelServiceProvider::class, LucaDegasperiOAuth2ServerStorageFluentStorageServiceProvider::class, LucaDegasperiOAuth2ServerOAuth2ServerServiceProvider::class,
在aliases里添加
'Authorizer'?=>?LucaDegasperiOAuth2ServerFacadesAuthorizer::class,
修改app/Http/Kernel.php文件里的內容
protected?$middleware?=?[LucaDegasperiOAuth2ServerMiddlewareOAuthExceptionHandlerMiddleware::class, ]; protected?$routeMiddleware?=?[ ??'oauth'?=>?LucaDegasperiOAuth2ServerMiddlewareOAuthMiddleware::class, ??'oauth-user'?=>?LucaDegasperiOAuth2ServerMiddlewareOAuthUserOwnerMiddleware::class, ??'oauth-client'?=>?LucaDegasperiOAuth2ServerMiddlewareOAuthClientOwnerMiddleware::class, ??'check-authorization-params'?=>?LucaDegasperiOAuth2ServerMiddlewareCheckAuthCodeRequestMiddleware::class, ??'csrf'?=>?AppHttpMiddlewareVerifyCsrfToken::class, ];
然后執行
php artisan vendor:publish?
php artisan migrate
在.env文件里添加這些配置
API_STANDARDS_TREE=x API_SUBTYPE=rest API_NAME=REST API_PREFIX=api API_VERSION=v1 API_CONDITIONAL_REQUEST=true API_STRICT=false API_DEBUG=true API_DEFAULT_FORMAT=json
修改appconfigoauth2.php文件
'grant_types'?=>?[ ??'password'?=>?[ ????'class'?=>?'LeagueOAuth2ServerGrantPasswordGrant', ????'access_token_ttl'?=>?604800, ????'callback'?=>?'AppHttpControllersAuthPasswordGrantVerifier@verify', ??], ],
新建一個服務提供者,在app/Providers下新建OAuthServiceProvider.php文件內容如下
namespace?AppProviders; ? use?DingoApiAuthAuth; use?DingoApiAuthProviderOAuth2; use?IlluminateSupportServiceProvider; ? class?OAuthServiceProvider?extends?ServiceProvider { ??public?function?boot() ??{ ????$this->app[Auth::class]->extend('oauth',?function?($app)?{ ??????$provider?=?new?OAuth2($app['oauth2-server.authorizer']->getChecker()); ? ??????$provider->setUserResolver(function?($id)?{ ????????//?Logic?to?return?a?user?by?their?ID. ??????}); ? ??????$provider->setClientResolver(function?($id)?{ ????????//?Logic?to?return?a?client?by?their?ID. ??????}); ? ??????return?$provider; ????}); ??} ? ??public?function?register() ??{ ????// ??} }
然后打開routes.php添加相關路由
//Get?access_token Route::post('oauth/access_token',?function()?{ ???return?Response::json(Authorizer::issueAccessToken()); }); ? //Create?a?test?user,?you?don't?need?this?if?you?already?have. Route::get('/register',function(){ ??$user?=?new?AppUser(); ???$user->name="tester"; ???$user->email="test@test.com"; ???$user->password?=?IlluminateSupportFacadesHash::make("password"); ???$user->save(); }); $api?=?app('DingoApiRoutingRouter'); ? //Show?user?info?via?restful?service. $api->version('v1',?['namespace'?=>?'AppHttpControllers'],?function?($api)?{ ??$api->get('users',?'UsersController@index'); ??$api->get('users/{id}',?'UsersController@show'); }); ? //Just?a?test?with?auth?check. $api->version('v1',?['middleware'?=>?'api.auth']?,?function?($api)?{ ??$api->get('time',?function?()?{ ????return?['now'?=>?microtime(),?'date'?=>?date('Y-M-D',time())]; ??}); });
分別創建BaseController.php和UsersController.php內容如下
//BaseController namespace?AppHttpControllers; ? use?DingoApiRoutingHelpers; use?IlluminateRoutingController; ? class?BaseController?extends?Controller { ??use?Helpers; } ? //UsersController namespace?AppHttpControllers; ? use?AppUser; use?AppHttpControllersController; ? class?UsersController?extends?BaseController { ? ??public?function?index() ??{ ????return?User::all(); ??} ? ??public?function?show($id) ??{ ????$user?=?User::findOrFail($id); ????//?數組形式 ????return?$this->response->array($user->toArray()); ??} }
隨后在app/Http/Controllers/Auth/下創建PasswordGrantVerifier.php內容如下
namespace?AppHttpControllersAuth; use?IlluminateSupportFacadesAuth; ? class?PasswordGrantVerifier { ??public?function?verify($username,?$password) ??{ ?????$credentials?=?[ ??????'email'??=>?$username, ??????'password'?=>?$password, ?????]; ? ?????if?(Auth::once($credentials))?{ ???????return?Auth::user()->id; ?????} ? ?????return?false; ??} }
打開數據庫的oauth_client表新增一條client數據
INSERT?INTO?'oauth_clients'?('id',?'secret',?'name',?'created_at',?'updated_at')?VALUES?('1',?'2',?'Main?website',?'2016–03–13?23:00:00',?'0000–00–00?00:00:00');
隨后的就是去愉快的測試了,這里要測試的API有
新增一個用戶
http://localhost/register
讀取所有用戶信息
http://localhost/api/users
只返回用戶id為4的信息
http://localhost/api/users/4
獲取access_token
http://localhost/oauth/access_token
利用token值獲得時間,token值正確才能返回正確值
http://localhost/api/time
打開PostMan