设置默认的JSON格式响应Laravel

时间:2017-06-19 14:26:47

标签: php json laravel

我正在练习按照Google(https://google.github.io/styleguide/jsoncstyleguide.xml)的指南制作一个优秀的RESTful API服务,以获取json格式的响应。

有没有办法为每个响应设置默认的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响应时都必须编写这种响应,这非常麻烦。

3 个答案:

答案 0 :(得分:3)

您可以使用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
});

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以通过在传入请求上设置“ accepts”标头来添加中间件以强制JSON响应。在HttpKernel的{​​{1}}中包括该中间件,以涵盖所有api路由。这是Laravel ^ 7.0解决方案。

$middlewareGroups['api']

-

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

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class JsonResponse {

    /**
     * Set 'Accept' header to force a JSON response for API routes.
     *
     * @param  Request  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {    
        $request->header->set('accept', 'application/json');
        return $response;
    }

}

感谢Alfredo EM将我引向这个解决方案。