Laravel 开发 RESTful API 的一些心得

最近用 Laravel 写了一段时间的 API,总结一下自己的心得吧。

Start

  • API开发我们可以看到,有些网站用token验证身份,有些用OAuth2.0,当时我也纠结,然后看到一个不错的说法。大方面,会涉及到给别人用的使用OAuth,自己使用的用token就足够了
  • 设计最初,最好在路由加个版本号,方便以后扩展
Route::prefix('v1')->group(function () {
    // more
});

一个简单的接口示例


api实例输出

验证

  • API 开发总会离不开验证,这里推荐使用jwt-auth,1.0 快要来了,新版本的文档也很清晰
  • 刚用jwt-auth时有疑问,Laravel自带的token验证使用的是数据库api_token字段验证,而不见jwt-auth需要这个
    • 然后想自己看源码,结果QAQ
    • 最后去问了官方 >_<
    • 原来用户的信息已经存储在token中加密
    • 一开始有疑问,这样保存,不会被解密吗(真为自己智商担忧 !_!)
    • 后来才想起,jwt一开始就运行php artisan jwt:secret生成了秘钥
    • 你不泄露就保证安全了~~~

路由

  • 当然使用官方api的路由Route::apiResource(),一条更比五条强
  • 路由的名字当然是RESTful的方式
  • 保持动词,复数形式,见名知义
  • 有些长的路由,应该用什么分隔呢?
  • laravel用的是中划线(-),因为谷歌收录时,按中划线划分关键字,国内的是按下划线(_)收录,具体看自己了,我是喜欢下划线 >_<
  • 更多看这里: 路由命名规范

表单验证

可以使用控制器自带的表单验证,更推荐使用 表单类,能分离都分离出去,控制器不要处理太多事情。

表单验证

能分离的代码都不要吝啬~~~

数据转换

  • Laravel自带的API Resource
  • 用起来真的很方便,不过发现一个问题,--collection的格式总是转不过来,后来直接放弃了
  • 单个的使用Resources
  • 集合的使用Resources::collection()发现,特别好用 >_<
  • 不得不说,多对多关联时,Laravel处理得太好了条件关联
    数据转换
  • 在上面这个例子中,如果关联没有被加载,则 posts 键将会在资源响应被发送给客户端之前被删除。
  • 在有不确定是否输出关联数据时,这是一个很有用的功能!!!

响应输出

当时在 laravel-china 看到的这个帖子,然后觉得这个方式不错,所以自己也这样子,使用基类的方法统一响应输出。

异常

异常算是一大手笔了,处理好异常,可以让你的代码优雅很多。
\App\Exceptions\Handler::render方法可以捕获到很多有用的异常,例如,我的代码是这样写的:

异常捕获

UnauthorizedHttpException这个是捕获jwt异常
ValidationException这个是表单异常,捕获之后,表单错误消息可以很好的格式化,
ModelNotFoundException这个是模型找不到的异常,捕获之后,可以直接在控制器直接这样

// 未捕获之前的写法
public function show($id)
{
    $user = User::find($id);
    if (! $user) {
        
    }
    
    // do something
}

// 现在
public function show($id)
{
    $user = User::findOrFail($id);
}
// 甚至这样
public function show(User $user)
{
    // do something
}
  • 下面这两个异常可以不捕获,只是方便开发中查看错误消息
    NotFoundHttpException404路由找不到的异常,没什么好说的了
    MethodNotAllowedHttpException这个是方法不对应,比如你是get路由,却post请求

文档

  • 差点忘了这个,文档非常非常重要
  • 我是不怎么喜欢在注释写文档的
  • 使用swagger-ui+swagger-edit
    • 下载swagger-ui
    • 只需要dist目录的东西(其他可以删除了)
    • 下载swagger-editor
    • 只要dist目录的东西和根目录的index.html
    • 我还把swagger-editorindex.html改成了edit.html,然后把这两个东西整合到同一个目录(记得修改css,js的位置)
    • 新建两个文件api.json,api.yaml 大概就和图中差不多
    • 要修改图中箭头所示成为api.json的位置
      api
  • 访问edit.html可以书写文档
  • 访问index.html可以查看文档
  • edit.html写好之后,导出json,然后粘贴到api.json文件
    api
  • 记得也把写好的格式保存到api.yaml,因为清楚缓存之后,下次访问时会消失

自己写了一个packages

  • 就方便创建控制器,验证
  • 所有控制器继承重写过的基类,响应输出方便。


    laravel-api-helper
  • 例如完整验证只需要三秒钟
    • 第一秒: php artisan api:auth
    • 第二秒: 出现图代表成功;


      laravel-api-helper
    • 第三秒: 拿出手臂的劳力士,确定只过了三秒


      手臂的手表
  • 更多的使用:laravel-api-helper

工作和API开发有关,用到其他有经验了再回来补补。

更多参考

RESTful API 设计指南

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,593评论 0 121
  • 必备品文档:DocumentationAPI: API Reference视频:Laracasts速查表:Lara...
    ethanzhang阅读 5,738评论 0 68
  • 一. 说明 以下内容大部分引用Laravel China社区的文章 - 分享下团队的开发规范 ——《Laravel...
    knghlp508阅读 7,843评论 0 28
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 简介 laravel 使实施认证的变得非常简单,事实上,它提供了非常全面的配置项以适应应用的业务。认证的配置文件存...
    Dearmadman阅读 6,091评论 2 13