2017-02-22 81 views
0

У меня есть угловое приложение. У меня возникла проблема с вызовом POST и с использованием директивы $ http. В моем контроллере я делаю два вызова через потребление Api службы, которые я сделал: getMe() и и назначение (CSV):

assignments: function(csv) { 
 
    var deferred = $q.defer(); 
 
    $http({ 
 
     method: 'POST', 
 
     url: '/api/numbers/assignments', 
 
     headers: { 
 
     'Content-Type': 'application/x-www-form-urlencoded' 
 
     }, 
 
     data: $.param({ 
 
     skipBillables: false, 
 
     assignments: csv, 
 
     }) 
 
    }).success(function(data) { 
 
     deferred.resolve(data); 
 
    }).error(function(data) { 
 
     deferred.reject(data); 
 
    }) 
 
    return deferred.promise; 
 
    }, 
 
    getMe: function() { 
 
    return this.cachedGet("https://stackoverflow.com/users/me"); 
 
    },
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>

Вот реальные вызовов в контроллере. Мы делаем запрос GET конечной точке пользователя, а затем отправляем сообщения в обратный вызов.

Api.getMe().then(function(data) { 
 

 

 

 
}, function(error) { 
 
    $window.location.reload(); 
 
}).finally(function() { 
 
    var checkouttollfreenumber = '1' + $scope.savedTollFreeNumberCheckout.tfn; 
 
    var assignObj = [{ 
 
    phoneNum: checkouttollfreenumber, 
 
    email: owner.emailAddress, 
 
    percent: 0, 
 
    }]; 
 
    var csvFile = downloadCSV(assignObj); 
 
    console.log(csvFile); 
 
    Api.assignments(csvFile).then(function(data) { 
 
    //do something 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>

Это правильно выполняется в Chrome и Firefox, но не Safari. В Safari он вызывает запрос GET на http: applicationname.com/18885052939,[email protected],percentageparameter. Запрос фактически вызывает сериализованные параметры вызова POST для присвоений.

В Chrome у нас есть правильное поведение. После запроса GET для пользователей/меня мы нажмем http://local.appname.com:9000/api/numbers/assignments с параметрами данных POST.

Не уверен, что вызывает ошибку в Safari, но интересно, где я ошибаюсь. Это более ранняя версия углового (1.2.15).

+0

Последнее исправление ошибки для Angular v1.2 - v1.2.32. Попробуйте эту версию, чтобы узнать, исправлены ли связанные с Safari ошибки. – georgeawg

+0

спасибо @georgeawg Я попробую. –

+0

@georgeawg попробовал. Кажется, это не источник проблемы. –

ответ

0

С помощью AngularJS v1.4 структура делает сериализатор параметров URL доступным как $httpParamSerializer для использования с POST-запросами API, которые поддерживают только тип контента application/x-www-form-urlencoded.

function assignments(csv){ 
    promise = $http({ 
     method: 'POST', 
     url: '/api/numbers/assignments', 
     headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
     }, 
     data: { 
     skipBillables: false, 
     assignments: csv, 
     }, 
     transformRequest: $httpParamSerializer 
    }); 
    return promise; 
} 

Для интерфейсов API, которые не принимают AngularJS рамочного значения по умолчанию application/json, программистам больше не нужно писать свой собственный сериалайзер или загрузить JQuery для его сериализатора.