2017-06-19 206 views
0

我正在按照Google(https://google.github.io/styleguide/jsoncstyleguide.xml)关于json格式响应的指导,努力创建一个良好的RESTful API服务。设置默认的JSON格式响应Laravel

有什么办法来设置每个响应的缺省JSON格式,因为在指南中说

为了保持整个API的一个一致的界面,JSON对象应 按照下面列出的结构。

object { 
    string apiVersion?; 
    string context?; 
    string id?; 
    string method?; 
    object { 
    string id? 
    }* params?; 
    object { 
    string kind?; 
    string fields?; 
    string etag?; 
    string id?; 
    string lang?; 
    string updated?; # date formatted RFC 3339 
    boolean deleted?; 
    integer currentItemCount?; 
    integer itemsPerPage?; 
    integer startIndex?; 
    integer totalItems?; 
    integer pageIndex?; 
    integer totalPages?; 
    string pageLinkTemplate /^https?:/ ?; 
    object {}* next?; 
    string nextLink?; 
    object {}* previous?; 
    string previousLink?; 
    object {}* self?; 
    string selfLink?; 
    object {}* edit?; 
    string editLink?; 
    array [ 
     object {}*; 
    ] items?; 
    }* data?; 
    object { 
    integer code?; 
    string message?; 
    array [ 
     object { 
     string domain?; 
     string reason?; 
     string message?; 
     string location?; 
     string locationType?; 
     string extendedHelp?; 
     string sendReport?; 
     }*; 
    ] errors?; 
    }* error?; 
}*; 

我与Laravel 5.4练习。我应该制作一个特质并使用自己的JSON响应格式吗?因为每次返回JSON响应时都必须编写这种响应非常麻烦。

+0

娜,我相信当你回归你的对象时,拉拉维尔正在照顾你。您还可以使用response() - > json([])指定输出,例如 – DevMoutarde

+0

请查看http://jsonapi.org/ json api标准。如果你选择使用它,有基于php的模块支持它。 – ayip

+0

@ayip可以在中型项目中使用它吗?因为它似乎是最后一次更新是在2015年。我已阅读了一些文档,我想使用它 –

回答

2

可以使用Middleware拦截响应对象,并对其进行格式化,只要你喜欢,比如我通常使用这种追加头的响应:

<?php 
# app/Http/Middleware/ResponseAPI.php 

namespace App\Http\Middleware; 

use Closure; 

class ResponseAPI { 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @param string|null $guard 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $guard = null) 
    { 
     $response = $next($request); 

     if (in_array($response->status(), [200, 201, 404, 401, 422])) { 
      $response->header('Content-Type', 'application/json'); 
     } 

     return $response; 
    } 

} 

-

<?php 
# app/Http/Kernel.php 
. 
. 
. 
protected $routeMiddleware = [ 
    # others middlewares 
    'api.response' => \App\Http\Middleware\ResponseAPI::class 
]; 

-

<?php 
# app/Http/routes.php 

$app->group(['prefix' => 'api/v1', 'middleware' => ['api.response']], function($app) { 
    # all routes 
}); 
+0

我认为这是在这种情况下唯一正确的决定。非常感谢。 – gogagubi