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 完成的,LaravelRequest::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() 总是假的的主要内容,如果未能解决你的问题,请参考以下文章