Ich habe eine Grundeinstellung für den AngularJS-Dienst:
app.factory('User', function($resource) {
return $resource('http://api.mysite.com/user/:action:id/:attr', {}, {
history: {
method: 'GET',
params: {
attr: 'history'
}
},
update: {
method: 'POST',
params: {
name: 'test'
}
}
});
});
und ich benutze es so:
User.history({id: 'testID'}, function(data) {
console.log('got history');
console.log(data);
});
User.update({id: 'me'}, function(data) {
console.log('updated');
console.log(data);
});
Problem eins: User.update () sendet trotz der auf POST eingestellten Methode weiterhin OPTIONS als Anforderungsmethode.
Chrome Dev-Tools meldet zwar den Request-Header Access-Control-Request-Method: Auch POST wird gesendet (nicht sicher, ob dies etwas bedeutet).
Problem zwei: Ich bekomme immer einen Fehler mit CORS, obwohl diese Header im API-Code gesetzt sind:
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
Dieses Problem tritt jedoch nur auf, wenn Sie eine Nicht-GET-Anforderung durchführen.
Was ist der richtige Weg, um damit umzugehen? Ich habe auch in JSONP nachgesehen, aber da dies eine RESTful-API ist, bin ich nicht sicher, wie ich die Probleme nur mit GET-Unterstützung umgehen kann.
Ihre zwei Probleme sind eigentlich ein Problem. Die Anforderung OPTIONS ist Teil des CORS-Prozesses. Bei POST - Anforderungen sendet der Browser zuerst einen Aufruf von OPTIONS. Der Server antwortet, ob er ausgeführt werden kann.
Wenn die Anforderung von OPTIONS fehlschlägt, zeigt Angular/Chrome den Grund in der Konsole an. Zum Beispiel:
OPTIONS https://*** Request header field Content-Type is not allowed by Access-Control-Allow-Headers. angular.min.js:106
XMLHttpRequest cannot load https://***. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
Sie müssen wahrscheinlich auch Access-Control-Allow-Header auf dem Server festlegen:
header('Access-Control-Allow-Headers: Content-Type, x-xsrf-token')
x-xrsf-token ist für angle ', um CSRF zu verhindern. Je nachdem, was Sie vom Client senden, müssen Sie möglicherweise weitere Header hinzufügen.
Hier ist ein sehr guter Leitfaden zu CORS: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
In AngularJS müssen Sie die Voreinstellungen des Winkels httpProvider
überschreiben, damit CORS funktioniert.
var myApp = angular.module('myApp', [
'myAppApiService']);
myApp.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
}
]);
Es genügt nicht, useXDomain auf true zu setzen. AJAX - Anfrage sind auch send mit dem Header X-Requested-With, der sie als .__ anzeigt. AJAX. Das Entfernen des Headers ist erforderlich, damit der Server nicht .__ ablehnt. die eingehende Anfrage.
Hinweis : Die Antwort funktioniert nur für ältere AngularJS-Versionen vor 1.2. Ab 1.2 müssen Sie nichts tun, um CORS zu aktivieren.
Besser, dieses Problem am Server zu lösen. Auf Apache können Sie es so in einer .htaccess
-Datei lösen. Dies ist eine Schmerzquelle für die Winkelentwicklung und kann auch in Winkel gelöst werden, aber es ist wahrscheinlich nicht die beste Art, dies zu tun.
Header set Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "Origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"