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() )
In Laravel, we can use $request->ajax() method to check request is ajax or not. Example: public function saveData(Request $request) { if($request->ajax()){ return "Request is of Ajax Type"; } return "Request is of Http type"; }
Angular vs AJAXAngular is more general whereas AJAX is more specific. In other words, Angular is a big framework whereas AJAX is a JavaScript method that enables asynchronous communication between the database and the server. Angular uses AJAX technology to build single-page applications.
The AngularJS provides a control service named as AJAX – $http, which serves the task for reading all the data that is available on the remote servers. The demand for the requirement of desired records gets met when the server makes the database call by using the browser. The data is mostly needed in JSON format.
The ajax request can be GET or POST or other valid types. To use AJAX in Laravel, you need to import a jquery library in your view file to use ajax functions of jquery, which will be used to send and receive data using ajax from the server.
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"
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With