$http ПОЛУЧИТЬ массив объектов из API

Ниже мой AirTableService.js

(function () {
    "use strict";   
    var AirTableService = function ($http, $q) {
        var AirTableMethods = {
            getMyRounds: function(AirTable_secret){
                var deferObject_myRounds;
                var myRounds_promise = $http.get('https://api.airtable.com/v0/XXXXXXX/Rounds?view=Main%20View&maxRecords=10&callback=JSON_CALLBACK', {
                    headers : {
                        'Authorization' : AirTable_secret.apikey,
                        'Content-Type' : 'application/json'
                    }
                });
                deferObject_myRounds = deferObject_myRounds || $q.defer();

                myRounds_promise.then(function(data){
                    deferObject_myRounds.resolve(data);
                });                
                return deferObject_myRounds.promise;
            }
        };
        return AirTableMethods;
    };

    AirTableService.$inject = ['$http', '$q'];

    angular.module('appGolf')
      .service('AirTableService', AirTableService);

}());

Как видите, используя AirTable api, я пытаюсь GET получить данные из своей таблицы. Я передаю параметры view и maxRecords и все работает. В документации указано, что я могу пройти sort,

введите здесь описание изображения

который я затем изменил на,

https://api.airtable.com/v0/XXXXXXX/Rounds?view=Main%20View&maxRecords=10&sort=[{field:'RoundID',direction:'desc'}]&callback=JSON_CALLBACK

и ясно, что это не работает, и это дает мне эту ошибку, введите здесь описание изображения
Я знаю, что это потому, что sort — это array of objects, и я знаю, что неправильно передаю это значение.

Мой вопрос, как вы это делаете в AngularJS?

Заранее спасибо.


person MadushM    schedule 03.05.2016    source источник
comment
Возможный дубликат http://stackoverflow.com/questions/19957858/send-array-via-get-request-with-angularjs-http-service   -  person Jon B    schedule 03.05.2016
comment
Вы пробовали двойные кавычки, как показано в примере?   -  person DrewJordan    schedule 03.05.2016
comment
$http уже возвращает обещание. Вам не нужно использовать $q.   -  person Kyle    schedule 03.05.2016
comment
@DrewJordan Я только что попробовал, без разницы, та же ошибка   -  person MadushM    schedule 03.05.2016
comment
ваше сообщение об ошибке показывает дополнительную одинарную кавычку после «desc», вы не добавили ее по ошибке, верно?   -  person DrewJordan    schedule 03.05.2016


Ответы (2)


Нашел ответ здесь Как уже упоминалось, мне нужно было добавить,

paramSerializer: '$httpParamSerializerJQLike',

И если вам интересно, моя функция теперь выглядит так:

var myRounds_promise = $http.get('https://api.airtable.com/v0/XXXXX/Rounds?callback=JSON_CALLBACK', {
                params: {
                    view: 'Main View',       
                    maxRecords: 10,
                    sort: [{"field": 'RoundID', "direction":'desc'}]                        
                },
                paramSerializer: '$httpParamSerializerJQLike',                    
                headers : {
                    'Authorization' : AirTable_secret.apikey,
                    'Content-Type' : 'application/json'
                }
            });

Спасибо всем за их предложения и помощь мне.

person MadushM    schedule 03.05.2016

Ваш сервис очень многословен и трудно читаем. Я бы написал так:

var app = angular.module("myApp", [ /* dependencies */ ]);

app.factory("AirTableService", ["$http", function($http) {
    return {
        getMyRounds: function(AirTable_secret) {
            return $http.get('path/to/API', {
                //put your sorting JSON object here in params
                params: { sort: [{field: "RoundID", direction: "desc"}] },
                headers: {
                    'Authorization' : AirTable_secret.apikey,
                    'Content-Type' : 'application/json'
                }
            });
        },
        anotherMethod: function() {
            //etc....
        },
        yetAnotherMethod: function() {
            return $http.post(); //maybe POST something
        }
    };
}]);

Вставьте его в свой контроллер и используйте:

AirTableService.getMyRounds(airtableSecret).then(successCallback).catch(errorCallback);
person Kyle    schedule 03.05.2016
comment
Я попробовал, как вы предложили, но все равно получаю ту же ошибку. Кстати, ценю форматирование моего сервиса, это имеет смысл. - person MadushM; 03.05.2016