详解Laravel制作API接口


Posted in PHP onMay 31, 2021

需要注意的是: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里添加

App\Providers\OAuthServiceProvider::class,

Dingo\Api\Provider\LaravelServiceProvider::class,

LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,

LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,

在aliases里添加

'Authorizer' => LucaDegasperi\OAuth2Server\Facades\Authorizer::class,

修改app/Http/Kernel.php文件里的内容

protected $middleware = [\LucaDegasperi\OAuth2Server\Middleware\OAuthExceptionHandlerMiddleware::class,
];
protected $routeMiddleware = [
 'oauth' => \LucaDegasperi\OAuth2Server\Middleware\OAuthMiddleware::class,
 'oauth-user' => \LucaDegasperi\OAuth2Server\Middleware\OAuthUserOwnerMiddleware::class,
 'oauth-client' => \LucaDegasperi\OAuth2Server\Middleware\OAuthClientOwnerMiddleware::class,
 'check-authorization-params' => \LucaDegasperi\OAuth2Server\Middleware\CheckAuthCodeRequestMiddleware::class,
 'csrf' => \App\Http\Middleware\VerifyCsrfToken::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

修改app\config\oauth2.php文件

'grant_types' => [
 'password' => [
 'class' => 'League\OAuth2\Server\Grant\PasswordGrant',
 'access_token_ttl' => 604800,
 'callback' => '\App\Http\Controllers\Auth\PasswordGrantVerifier@verify',
 ],
],

新建一个服务提供者,在app/Providers下新建OAuthServiceProvider.php文件内容如下

namespace App\Providers;
   
use Dingo\Api\Auth\Auth;
use Dingo\Api\Auth\Provider\OAuth2;
use Illuminate\Support\ServiceProvider;
   
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 App\User();
 $user->name="tester";
 $user->email="test@test.com";
 $user->password = \Illuminate\Support\Facades\Hash::make("password");
 $user->save();
});
$api = app('Dingo\Api\Routing\Router');
   
//Show user info via restful service.
$api->version('v1', ['namespace' => 'App\Http\Controllers'], 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 App\Http\Controllers;
   
use Dingo\Api\Routing\Helpers;
use Illuminate\Routing\Controller;
   
class BaseController extends Controller
{
 use Helpers;
}
   
//UsersController
namespace App\Http\Controllers;
   
use App\User;
use App\Http\Controllers\Controller;
   
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 App\Http\Controllers\Auth;
use Illuminate\Support\Facades\Auth;
   
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

以上就是详解Laravel制作API接口的详细内容,更多关于Laravel制作API接口的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
php 错误处理经验分享
Oct 11 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
Laravel框架表单验证详解
Sep 04 PHP
php的XML文件解释类应用实例
Sep 22 PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
php 中的closure用法详解
Jun 12 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
浅谈PHP7中的一些小技巧
May 29 #PHP
详解Laravel服务容器的优势
May 29 #PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
浅谈Laravel中使用Slack进行异常通知
May 29 #PHP
详解Go与PHP的语法对比
May 29 #PHP
详解php中流行的rpc框架
如何在Mac上通过docker配置PHP开发环境
You might like
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python采集百度百科的方法
2015/06/05 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
详解Python高阶函数
2020/08/15 Python
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
小学教师国培感言
2014/02/08 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
党员年终个人总结
2015/02/14 职场文书
英文辞职信范文
2015/05/13 职场文书
MySQL 数据表操作
2022/05/04 MySQL