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

Glo*_*ire 7 php api json laravel-5 laravel-5.4

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

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

我已经用邮递员对其进行了测试,当请求标头包含以下键和值时,它运行良好:

  • 授权:Bearer api_token
  • 接受:应用程序/json

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

'error' => 'Unauthenticated' // in JSON format
Run Code Online (Sandbox Code Playgroud)

但是当没有设置 Accept 头时,laravel 默认返回一个视图。但是对于 API,视图是不可接受的。

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

就像是:

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

或者

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

Rob*_*ert 11

您可以为此创建一个中间件。

您将检查并强制执行 Accept 标头,以便 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

而在你的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Robert 在 Laravel 5.6 中:`$request->header('Accept', 'application/json');` 检索值并且不改变请求。所以这是行不通的。这个有效 /sf/answers/2472392961/ (5认同)
  • 中间件*是* Laravel 开箱即用的解决方案。我添加了另一个示例,您只需在处理请求之前覆盖接受标头即可。 (2认同)