Laravel angularjs Request::ajax() 总是假的

Posted

技术标签:

【中文标题】Laravel angularjs Request::ajax() 总是假的【英文标题】:Laravel angularjs Request::ajax() always false 【发布时间】:2013-12-26 20:20:54 【问题描述】:

我正在使用 angularjs 和 laravel 4 构建应用程序。 一切都很好,但我现在只需要允许 XHR 请求。

这是我在控制器开始时所拥有的。 但这种说法总是错误的。

    if (!\Request::ajax())
    
        return Response::json(array('halt'=>Request::ajax()));
    ;

在 Angular 中,我使用标准的 $http 服务。

angular.module('APP')
.factory("API", ($http,$q,appClient,apiURL) ->
 class FB
  constructor:->
    this.deferredData = $q.defer();
  info: (reload)->
    $http(
      method: "get"
      url: apiURL+'game/'+appClient+"/info"
    ).success((res)->
      dostuff()
    )

【问题讨论】:

Check this answer. 大多数浏览器在进行 AJAX 调用时通常会设置一个标头:X-Requested-With: XMLHTTPRequest。你从浏览器检查器中看到那个标题了吗? 非常感谢我必须设置:$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest" 【参考方案1】:

在进行 AJAX 调用时,X-Requested-With 标头通常设置为 XMLHttpRequest。 Laravel 的 Request::ajax() 方法建立在 Symfony2 方法之上,该方法简单地检查此标头的存在。

2012年10月,Angular.jsremoved这个头,因为他们觉得很少用。

正如@Thrustmaster 和您自己在 cmets 中提到的,您需要设置:

$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"

【讨论】:

是的,我知道这个问题很老了。这个答案只是为了把它从“未回答的问题”列表中删除——这就是它是社区 wiki 的原因。【参考方案2】:

如果您不想修改前端 Angular 应用程序(或不能),并且宁愿修改您的 Laravel 代码以区分 Angular JS AJAX 请求与其他请求,您也可以使用Request::wantsJson()

if(Request::wantsJson()) 
    // Client wants JSON returned 
 else 
    // Client does not want JSON returned

wantsJson 方法依赖于标准的Accepts HTTP 标头(而不是非标准的X-Requested-With 标头)来确定application/json 的存在。只要 Angular JS 在默认情况下保留它并且您没有故意删除它,这种方法应该是可靠的。

【讨论】:

谢谢,我喜欢这个解决方案 :) 完美。正是我想要的。 加我的 2 美分 - 这个答案在某些情况下会有所帮助,但在其他情况下无济于事,例如当角度加载模板文件(路由器、指令等)时 - 虽然技术上是通过 ajax 完成的,Laravel Request::wantsJson()不会拦截它。 Moshe 接受的答案是 IMOH 是验证所有请求是否得到正确处理的更好方法。无论如何,在 Laravel 方面,您应该始终检查 if (Request::isAjax() || Request::wantsJson()) 【参考方案3】:

对于寻找在哪里添加$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest" 的 AngularJs 新手

这是一个例子:

var angularApp = angular
  .module('angularApp', [
    'ngResource',
  ])
  .config(['$httpProvider', function($httpProvider) 
      $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
  ]);

【讨论】:

以上是关于Laravel angularjs Request::ajax() 总是假的的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ngAA 集成到 Laravel jwt-auth

结合 AngularJS 和 Laravel 路由

如何使用 AngularJs 处理 Laravel 路由?

Laravel 4 和 AngularJS - 使用路由清理 URL

AngularJS + Laravel 5 身份验证

同时使用 Laravel 和 Angularjs 路由