1

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 オブジェクトを吐き出しています。

コンソールへのAngularソースmod

既知の適切な電子メールとパスワードでログインすると、すべて正常に動作します。

200 OK 応答 JSON

しかし、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 はエラー コードを変更しているため、ブラウザーと角度が一致しません。

angularはXHRレスポンスからhttpコードを変更します

Postman 経由で同じリクエストを送信すると、400 Bad Request コードは同じですが、予想どおり、本文も json 文字列です。

これが onLoginError() コールバック内の $http CORS 経由で利用できないのはなぜですか?

郵便配達員は正常に動作します

4

2 に答える 2

0

問題は、私のAPIサーバーコードにありました。私のアプリは Content-Type ヘッダーのみを送信していましたが、nginx は Allow-Origin ヘッダーを提供し、アプリがヘッダーを認識しないようにできると考えました。

Play 2.2.1を参照してくださいSimpleResult 4xx レスポンスボディは CORS XHR 経由で可能ですか? 答えのために。CORS を介して問題を修正したのは、Play Scala .withHeaders() の部分です。

nginxにすべてのヘッダーを処理させる方法があるかどうか疑問に思っています.proxy_passセクションが正しく行われていない可能性があります.

于 2014-03-29T05:27:19.230 に答える