UPDATE Mar 21
さらに調査した結果、Play フレームワークのバグ、エラー ステータスの XHR 制限も示されているようです:
Play 2.2.1 SimpleResult 4xx Response Body それ、または私が求めるRESTfulnessは、401コードでは不可能です.
以下のように、Angular $http で 401 が 0 ステータス コードを取得するため、両方のスペースでまだ問題があります。RESTfulness については以上です。私がしたいのは、401 Unauthorized の応答本文を提供することだけです。4xxのW3C ページから: 「ユーザー エージェントは、含まれているすべてのエンティティをユーザーに表示する必要があります。」
3月20日更新
さらに調査した結果、XMLHttpRequest 自体の問題が指摘されていますが、以下に何か不足がある場合はお知らせください。Angular の createHttpBackend() 内で定義されているように、xhr.onreadystatechange() コールバック内の生の XHR オブジェクトを吐き出しています。
既知の適切な電子メールとパスワードでログインすると、すべて正常に動作します。
しかし、400 Bad Request (間違ったパスワード) の同じ XHR オブジェクトには空の応答がありますが、さらに重要なことに status=0 です。これは、Mozilla ドキュメントから、要求が送信されなかったことを示しています (ただし、API サーバーが要求を取得して DB を実行していることがわかります) Postman が上記のように動作するため、ルックアップ):
何を与える?Postman はどのように応答を取得しますが、最新の Chrome と Firefox の XMLHttpRequest は混乱していますか?
$http を使用して POST リクエストを送信し、ブラウザー (Chrome と FF) と Postman で競合する応答を取得しています。Postman は正常に動作し、本文も持っていますが、Angular は、テンプレートがキャッシュされたときに Android ブラウザーで奇妙な点を処理するためにいくつかの応答コードを「クリーンアップ」しているように見えますが、生の XHR が発生している場所を $httpBackend で特定することはできません応答本文を傍受します-おそらく、XHRが応答をブロック/キャンセルしているためですか? セキュリティのため?インターセプターも持っていません。
「ハッピーパス」ログインは正常に機能し、コンソール/firebug で一致する 200 OK 応答を取得しますが、400 Bad Request には応答本文がありません。
CORS は nginx で構成され ( http://enable-cors.org/server_nginx.htmlを参照)、ハッピー ログインの成功が機能するため、セットアップは機能します。
私の電話:
var onLoginSuccess = function(data, status, headers, config){
console.log('[onLoginSuccess]')
console.log(data)
console.log(status)
console.log(headers)
console.log(config)
}
var onLoginError = function(data, status, headers, config){
console.log('[onLoginError]')
console.log(data)
console.log(status)
console.log(headers)
console.log(config)
}
var loginObj = {
'username': $scope.username,
'password': $scope.password,
'grant_type': 'password',
'client_id': 'web'
}
var doLogin = $http({
method: 'POST',
url: 'https://api/v1/token',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
transformRequest: function(obj) {
var str = [];
for(var p in obj) {
str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
}
return str.join('&');
},
data: loginObj,
responseType: 'json'
})
doLogin.then(
onLoginSuccess,
onLoginError
)
Angular はエラー コードを変更しているため、ブラウザーと角度が一致しません。
Postman 経由で同じリクエストを送信すると、400 Bad Request コードは同じですが、予想どおり、本文も json 文字列です。
これが onLoginError() コールバック内の $http CORS 経由で利用できないのはなぜですか?