API(Application Programming Interface,应用程序编程接口)在WEB应用中是非常常见的,比如开发微信应用有微信API,做淘宝的有淘宝API,不同的API有不同的接口,不同请求方式,一般API都有一个URL的访问地址,通过这个访问地址可以获取到自定义数据,但这并不是公开的。

       Laravel做api可以利用dingo+jwt组件来做,但是在做api接口之前,我们先来理解下api的开发思路是怎么样的。

       首先先了解下一个叫做Restful的api设计理论,所谓设计理论只是一种思想,我们可以遵守这种思想来开发自己的api,当然你也可以选择不遵守也可以参考比如豆瓣的api,看看别人的api是怎么定义的。

       这里可以参考一下阮一峰的文章:

       http://www.ruanyifeng.com/blog/2014/05/restful_api.html

      通过文章的介绍对于怎么打造RESTsfull风格的api已经有了初步的认识,接下来就要利用laravel当中一些方便的方法,来帮助我们打造API。

      通常情况下当开发一个应用,我们需要执行CRUD(创建,读取,更新,删除)操作。Laravel使这项工作更容易做到的。只需创建一个控制器,而Laravel会提供所有的CRUD操作的方法,同时只需要在laravel当中注册一个资源路由就行。

      利用artisan创建一个资源控制器php artisan make:controlle TestController –resource同时Route.php当中注册资源路由
Route::resource('fans',‘TestController');路由以及控制器方法都会自动生成。

     接下来我们将借用laravel的资源控制器及路由,来模拟实现一个api接口,通过在api.php当中定义资源路由来实现接口

     当我们在路由当中定义资源路由后可以通过 php artisan route:list 查看所有已经定义好的路由所看到的路由方式和我们的实际api开发的路由是差不多的你也可以去看一些平台的api的文档 你会发现也都是遵循这样的规则。

 一、字段映射
      1.通常的我们在请求一个服务的api时会附加一些信息 如状态码、接口消息 这些信息都是必须的 但是我们的数据库里是没有这些信息数据的。

      2.再者就是数据库里的字段我们不会想要把他们全部反馈给用户 比如我们不想把数据库的字段名称暴露出去,所以说在这里我们就需要对字段进行映射以满足我们对数据的请求。

     3.因为不同的模型要映射的字段是不同的所以我们可以单独的为每个类去创建一个,那么这个方法我们可以抽离出来,形成类。

二、请求错误返回及状态码

        通过阅读RESTfull设计我们知道api的设计当中有一个东西非常重要也就是错误返回。

       比方说错误的参数和不存在的数据 用户想要请求id为10的这条数据但实际上并不存在这条数据 所以这时候我们会返回这种错误处理信息。

        对于这样的场景 我们目前能想象得到的就是判断对应的请求信息 如果正确即返回 否则返回错误信息 比如说常见的404错误。

        毫无疑问,为了代码的重用同样我们需要提取出来,这里可以使用trait特性。

        在trait当中可以定义一些比较常见的错误

  • 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
  • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
  • 204 NO CONTENT - [DELETE]:用户删除数据成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
  • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
  • 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
  • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
  • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

        当然api接口的调用并不是每个用户都有权限调用的,所以我们需要对调用接口的用户鉴权

        我们可以创建一个中间件,来做相关的操作,如果用户的token是正确的,就允许执行

        php artisan make:middleware VerifyApiToken

Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求,例如,CSRF 保护,每次表单提交请求过来都会去验证表单的token是否正确。