如何为路由组中的所有请求设置标头

时间:2017-06-09 08:43:03

标签: php json api laravel-5 laravel-5.4

我正在使用Laravel 5.4创建一个API,它一切正常。我使用了以下中间件=> auth:像这样的api

Route::group(['middleware' => 'auth:api'], function(){ 
    Route::get('URIValue', ControllerName@action) //Example
});

我已经用postman测试了它,当请求标头包含以下键和值时,它运行良好:

  • 授权:Bearer api_token
  • 接受:应用/ JSON

当api_token无效时,将执行Handler类的未经身份验证的功能。 laravel返回的默认响应是

'error' => 'Unauthenticated' // in JSON format

但是当未设置Accept标头时,laravel默认返回一个视图。但是使用API​​,视图是不可接受的。

对于路由组中路由的每个请求,如何强制laravel检查Accept标头是否设置了正确的值(在这种情况下,值必须为=> accept / json)? / p>

类似的东西:

protected function mapApiRoutes()
{
    Route::prefix('api')
          ->middleware('api')
          ->namespace($this->namespace)
          ->header('Accept' => 'application/json') //this
          ->group(base_path('routes/api.php'));
}

Route::group(['middleware'  => 'auth:api', 
              'headers'     => ['Accept' => 'application/json']
             ], function(){ 
                    Route::get('URIValue', ControllerName@action) //Example
             });

2 个答案:

答案 0 :(得分:4)

您可以为此创建中间件。

您已经检查并强制执行A​​ccept标头,因此无论如何,Laravel都会输出json ..

class WeWantJson
{
    /**
     * We only accept json
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $acceptHeader = $request->header('Accept');
        if ($acceptHeader != 'application/json') {
            return response()->json([], 400);
        }

        return $next($request);
    }
}

在您的App\Http\Kernel中,您可以将中间件添加到api组。然后,无需在路由/路由组中手动添加它。

编辑:

你也可以添加一个中间件来强制执行json,无论是什么......

class EnforceJson
{
    /**
     * Enforce json
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

答案 1 :(得分:0)

您可以使用像这样的简单中间件

class OnlyAcceptJsonMiddleware
{
    /**
     * We only accept json
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
       // Verify if request is JSON
        if (!$request->expectsJson()) {
            return response(['message' => 'Only JSON requests are allowed'], 406);
        }

        return $next($request);
    }
}

然后在您的App \ Http \ Kernel中,可以将中间件添加到您的api组或您要使用的任何组中。