Laravel $request->expectsJson()

Posted

技术标签:

【中文标题】Laravel $request->expectsJson()【英文标题】: 【发布时间】:2017-12-14 09:31:36 【问题描述】:

我正在为我的 Laravel 应用程序进行 Ajax 登录。

我正在使用 Angular:

$http(
  method: 'POST',
  url: '/admin/login',
  headers: 
        'Content-Type': 'application/json'
  ,
  data: email:$scope.email,password:$scope.password
)

这个请求工作正常,我的问题是 Laravel 的响应总是重定向我,因为它应该 如果我没有发送 JSON:

protected function sendFailedLoginResponse(Request $request)
    
        $errors = [$this->username() => trans('auth.failed')];
        if ($request->expectsJson()) 
            return response()->json($errors, 422);
        
        return redirect()->back()
            ->withInput($request->only($this->username(), 'remember'))
            ->withErrors($errors);
    

那是 Laravel 框架代码。它不断将我重定向回来,但我想触发条件 if ($request->expectsJson()) 并获得 JSON 响应而不是重定向。

为了触发该条件,我缺少什么?

我什至补充说:

 headers: 
        'Content-Type': 'application/json','X-Requested-With' :'XMLHttpRequest'
  

而且还是不行。

expectsJson():

public function expectsJson()
    
        return ($this->ajax() && ! $this->pjax()) || $this->wantsJson();
    

我的标题:

Accept:application/json, text/plain, /

接受编码:gzip,放气

Accept-Language:en-US,en;q=0.8

连接:保持活动状态

内容长度:57

内容类型:应用程序/json

X-Requested-With:XMLHttpRequest

出于安全原因,我没有包含令牌/cookie 和原始 url,但它们在那里。

编辑:我尝试清除工匠缓存,但仍然没有。

php artisan cache:clear

还有

composer dump-autoload

【问题讨论】:

您必须添加Accept 标头,如here 所述 @Maraboc 我的 Accept 标头已经是 application/json, text/plain, */* 用户是否已经登录?! Guest 中间件应用于 AuthController 的所有路由,getLogout 除外。因此,对这些路由的任何 ajax 调用都会重定向到主路由 @Leo_Kelmendi 不,我提供的凭据不正确,我没有登录。 你能给我们这个$request->expectsJson()的输出吗?条件可能不正确,所以它会跳过那个if并重定向回来 【参考方案1】:

您应该使用Accept 键而不是Content/type。更多详情请查看this github discussion

【讨论】:

祝福你!我们使用content/type 在这个问题上猛烈抨击了一段时间。

以上是关于Laravel $request->expectsJson()的主要内容,如果未能解决你的问题,请参考以下文章

Laravel框架之Request操作

Laravel 刀片“request()->is()”语法问题

laravel如何知道request()->getHttpHost()的值

laravel 查询

Laravel $request->expectsJson()

$request->user() 在 Laravel 5.5 中返回 null