Я создаю приложение с angularjs и laravel 4. Все в порядке, но мне нужно теперь разрешить только запросы XHR.
Это то, что у меня есть в начале моего контроллера. Но это утверждение всегда ложно.
if (!\Request::ajax()) { return Response::json(array('halt'=>Request::ajax())); };
В угловой я использую стандартный сервис $ 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() )
При выполнении вызовов AJAX заголовок X-Requested-With
часто устанавливается в XMLHttpRequest
. Метод Laravel's Request::ajax()
построен поверх метода Symfony2, который просто проверяет наличие этого заголовка.
В октябре 2012 года Angular.js удалили этот заголовок, потому что считали, что он редко используется.
Поскольку @Thrustmaster и вы упомянули в комментариях, вам нужно установить:
$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"
Если вы не захотите модифицировать внешнее угловое приложение (или не можете) и скорее измените свой код 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
. Пока Угловой JS оставляет это по умолчанию, и вы не удаляете его специально, этот метод должен быть надежным.
Для новичков AngularJs ищет, где добавить $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"
Вот пример:
var angularApp = angular .module('angularApp', [ 'ngResource', ]) .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; }]);