Как сделать запрос JSONP

Мне нужно сделать несколько скриптов на разных сайтах. Блок кода ниже содержит метод jsonp, метод возвращает, как если бы он не удался, но когда я меняю его на запрос получения, я получаю успех. Мне нужно иметь возможность успешного ответа с использованием метода jsonp. Можно исключить следующее. Ответ действителен json, и этот параметр находится в URL-адресе url = JSON_CALLBACK. Вот json, который я получаю от выполнения http-запроса и кода, который выполняет этот код.

HTTP-код состояния ответа 200

[{"cube":"1" ,"points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"}]

блок кода

 var myApp = angular.module('test', []);

    myApp.controller('UserCtrl', function($scope, users) {
        $scope.usersPerCube = users.getUsers();
    })

    myApp.factory('users', function($http) {
       return {
         getUsers: function() {
           var deferred = $q.defer();
           var url = "http://localhost/api/api/index.php/analytics/UsersPerCube?callback=JSON_CALLBACK";
         $http.get(url).success(function (data, status, headers, config) {
                console.log(data);
                deferred.resolve(data);
            }).error(function (data, status, headers, config) {
                //this always gets called
                console.log(status);
                deferred.reject(status);
            });
            return deferred.promise;

     }
   }

Обратите внимание, что я редактировал код на стороне сервера и теперь получаю

"angular.callbacks._1( {"cube":"1","points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"})"

UPDATE Вышеприведенное действие действительно и теперь выполняется метод успеха. Мне просто нужно выяснить, как разбирать объекты. Я отправлю сообщение после того, как выясню ответ.

Ответ 1

Я решил дать подробное описание того, как сделать запрос jsonp, чтобы другие не сталкивались с теми же проблемами, что и Я сделал.

myApp.factory('users', function($http) {
       return {
         getUsers: function() {
           var deferred = $q.defer();
           var url = "http://localhost/api/api/index.php/analytics/UsersPerCube?callback=JSON_CALLBACK";
         $http.get(url).success(function (data, status, headers, config) {
                console.log(data);
                deferred.resolve(data);
            }).error(function (data, status, headers, config) {
                //this always gets called
                console.log(status);
                deferred.reject(status);
            });
            return deferred.promise;

     }  

Обратите внимание, что URL содержит ?callback=JSON_CALLBACK. fooobar.com/questions/54148/... Как только вы получите ответ, вы получите json, как показано ниже.

"angular.callbacks._1( {"cube":"1","points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"})"

fooobar.com/questions/293648/...

Теперь одна часть, которая меня достала, заключается в том, что сервер должен вернуть параметр GET, callback. Вот хороший учебник для этого. http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/ Таким образом, json выглядит как выше.

Ну, надеюсь, это поможет кому-то в будущем.

Ответ 2

Если вы хотите сделать несколько запросов JSONP через службу $http, вы должны использовать небольшой взлом. Agular изменение JSON_CALLBACK на внутреннее значение и лучший способ использовать следующее решение: поместите этот код js в возвращаемый js файл:

var callbackId = '_' + (angular.callbacks.counter - 1).toString(36);
angular.callbacks[callbackId](/* YOUR JSON */);

Чтобы убедиться, что этот код будет работать для вас, проверьте createHttpBackend метод в angular источниках.