Laravel angularjs Request::ajax() always false

2019-01-23 23:14发布

问题:

I'm building application with angularjs and laravel 4. Everything is fine but I need now to allow only XHR requests.

This is what I have at the beginning of my controller. But this statement is always false.

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

In angular I'm using standard $http service.

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()
    )

回答1:

When doing AJAX calls, the X-Requested-With header is often set to XMLHttpRequest. Laravel's Request::ajax() method is built on top of a Symfony2 method that simply checks for the presence of this header.

In October 2012, Angular.js removed this header because they felt that it was rarely used.

As @Thrustmaster and yourself mentioned in the comments, you need to set:

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


回答2:

If you'd rather not modify the front-end angular application (or can't), and would rather modify your Laravel code to differentiate between Angular JS AJAX requests vs. other requests, you can also use Request::wantsJson():

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

The wantsJson method relies on the standard Accepts HTTP header (rather than the non-standard X-Requested-With header) for the presence of application/json. As long as Angular JS leaves that in by default and you don't remove it on purpose, this method should be reliable.



回答3:

For AngularJs newbies looking for where to add $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"

Here is an example:

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