2017-02-22 5 views
0

Ich habe eine eckige Anwendung. Ich habe Probleme mit einem POST-Aufruf und der Verwendung der $ http-Direktive. In meinem Controller mache ich zwei Anrufe durch den Verzehr von Api-Service, die ich gemacht: getMe() und und Zuweisungen (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>

Hier sind die tatsächlichen Anrufe in der Steuerung. Wir stellen die GET-Anforderung an den Endpunkt des Benutzers und anschließend an Zuordnungen im Rückruf bereit.

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>

Es führt ordnungsgemäß in Chrome und Firefox, aber nicht Safari. In Safari ruft es eine GET-Anforderung an http: applicationname.com/18885052939,[email protected],percentageparameter auf. Die Anforderung ruft die serialisierten Parameter des POST-Aufrufs tatsächlich zu Zuweisungen auf.

In Chrome haben wir das richtige Verhalten. Nach der GET-Anfrage für Benutzer/mich haben wir http://local.appname.com:9000/api/numbers/assignments mit den POST-Datenparametern erreicht.

Nicht sicher, was den Fehler in Safari verursacht, aber ich frage mich, wo ich falsch liege. Dies ist eine ältere Version von eckig (1.2.15).

+0

Der letzte Bugfix für Angular v1.2 ist v1.2.32. Probieren Sie diese Version aus, um zu sehen, ob Safari-Bugs behoben wurden. – georgeawg

+0

danke @georgeawg Ich werde es versuchen. –

+0

@georgeawg hat es versucht. Es scheint nicht die Ursache des Problems zu sein. –

Antwort

0

Mit AngularJS v1.4 stellt das Framework den URL-Parameter Serializer als $httpParamSerializer zur Verwendung mit POST-Anfragen für APIs bereit, die nur den Inhaltstyp application/x-www-form-urlencoded unterstützen.

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; 
} 

Für APIs, die die AngularJS Rahmen Standard von application/json, Anwendungsprogrammierer nicht mehr benötigen, nicht akzeptieren, um ihre eigenen Serializer zu schreiben oder jQuery für seine Serializer laden.

Verwandte Themen