私はAngularJS v1.2.4を使用しています。
私は角度がプリフライトOPTIONSは(クロームOPTIONSは、「キャンセル」と呼んで見せていた)を呼び出し、送信の問題を持っていたし、それを解決:
すべての私の$リソース・コールのために働い$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
、およびすべてのものよかった。
私は認証を実装しようとしています。ユーザーの資格情報を使用してサーバーにPOST要求を送信するログインページを試しています。私は前に直面していた問題を見ていますが、$リソースコールはまだ正常に動作しています。
本当に不快なことは、問題が断続的に発生することです。ヘッダーを囲むいくつかのオプションを変更してから、ちょっとした作業をして、コードを変更せずにもう一度作業をやめてください。
私のサーバーはCORS用に構成されており、curlや他のRESTクライアントで正常に動作します。ここでは例です:
var authRequest = $http.post('https://' + $location.host() + ':3001/authenticate', {email: email, password: password});
を私のアプリの作品からの呼び出しが、これはOPTIONS要求がどのように見えるかのとき:
curl -X OPTIONS -ik 'https://localhost:3001/authenticate' -H "Origin: https://localhost:8001"
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 2
cache-control: no-cache
access-control-allow-origin: *
access-control-max-age: 86400
access-control-allow-methods: GET, HEAD, POST, PUT, DELETE, OPTIONS
access-control-allow-headers: Authorization, Content-Type, If-None-Match, Access-Control-Allow-Headers, Content-Type
access-control-expose-headers: WWW-Authenticate, Server-Authorization
set-cookie: session=Fe26.2**94705d49717d1273197ae86ce6661775627d7c6066547b757118c90c056e393b*2KYqhATojPoQhpB2OwhDwg*W9GsJjK-F-UPqIIHTBHHZx1RXipo0zvr97_LtTLMscRkKqLqr8H6WiGd2kczVwL5M25FBlB1su0JZllq2QB-9w**5510263d744a9d5dc879a89b314f6379d17a39610d70017d60acef01fa63ec10*pkC9zEOJTY_skGhb4corYRGkUNGJUr8m5O1US2YhaRE; Secure; Path=/
Date: Wed, 18 Dec 2013 23:35:56 GMT
Connection: keep-alive
はここで$ http.postを呼びました
動作しない場合は、OPTIONSリクエストです。
ヘッダー属性が完全に不足しているようです。誰も似たような問題に遭遇しましたか?
編集:それは動作しない場合
だけで、明確にする、要求がサーバーにそれを作ることはありません - それはすぐにブラウザで中止されています。 Firebugので
、リクエストヘッダは次のとおりです。
OPTIONS /authenticate HTTP/1.1
Host: localhost:3001
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.91,en-GB;q=0.82,fr-FR;q=0.73,fr;q=0.64,utf-8;q=0.55,utf;q=0.45,de-DE;q=0.36,de;q=0.27,en-sg;q=0.18,en-ca;q=0.09
Accept-Encoding: gzip, deflate
Origin: https://localhost:8001
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Proxy-Authorization: Basic cGF0cmljZUB6b25nLmNvbTpjaGFuZ2VtZQ==
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
更新:
私はおそらくサーバーに問題のを排除してきた、私は思いますホストを存在しないサーバーに変更します。それでも同じ動作が見られます。
はここにいくつかのコードです:
App.services.factory('AuthService', function ($http, $location, $q) {
var currentUser;
return {
authenticate: function (email, password) {
//promise to return
var deferred = $q.defer();
var authRequest = $http.post('https://this.does.not.exist.com:3001/authenticate', {email: email, password: password});
authRequest.success(function (data, status, header, config) {
currentUser = data;
console.log('currentUser in service set to:');
console.log(currentUser);
//resolve promise
deferred.resolve();
});
authRequest.error(function (data, status, header, config) {
console.log('authentication error');
console.log(status);
console.log(data);
console.log(header);
console.log(config);
//reject promise
deferred.reject('authentication failed..');
});
return deferred.promise;
},
isAuthenticated: function() {
return currentUser !== undefined;
}
};
});
とHTTP設定:それはあなたがあなたのローカルホスト上https
エンドポイントをヒットしているという事実に関連するかもしれないようにこれが感じる
App.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.useXDomain = true;
//$httpProvider.defaults.headers.common = {};
console.log('logging out headers');
console.log($httpProvider.defaults);
console.log($httpProvider.defaults.headers.common);
console.log($httpProvider.defaults.headers.post);
console.log($httpProvider.defaults.headers.put);
console.log($httpProvider.defaults.headers.patch);
console.log('end logging out headers');
$httpProvider.defaults.headers.common = {Accept: "application/json, text/plain, */*"};
$httpProvider.defaults.headers.post = {"Content-Type": "application/json;charset=utf-8"};
console.log('after: logging out headers');
console.log($httpProvider.defaults.headers.common);
console.log($httpProvider.defaults.headers.post);
console.log($httpProvider.defaults.headers.put);
console.log($httpProvider.defaults.headers.patch);
console.log('after: end logging out headers');
$httpProvider.interceptors.push(function ($location, $injector) {
return {
'request': function (config) {
console.log('in request interceptor!');
var path = $location.path();
console.log('request: ' + path);
//injected manually to get around circular dependency problem.
var AuthService = $injector.get('AuthService');
console.log(AuthService);
console.log(config);
if (!AuthService.isAuthenticated() && $location.path() != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
//add headers
console.log(config.headers);
return config;
}
};
});
}]);
あなたのスクリプト/アプリは二重の要求を送信していませんか?同じURLに同期(フォーム提出)+非同期リクエスト? – asumaran
@asumaranお願いしますか?私はそれが単なる要求だと確信しています。 – shaunlim
CORSの問題をデバッグするためにfirebugを使用してください。 Chromeには既知の問題があり、利用可能なすべての情報は表示されません。 https://code.google.com/p/chromium/issues/detail?id=269192&q=CORS&colspec=ID%20Pri%20M%20Iteration%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified – TheSharpieOne