2

カウボーイと angular.js を使用した erlang Web アプリケーションがあります。

<input>アプリケーションを起動し、「/」でブラウザを開き、およびで main.html を取得しました<button>。ボタンを押すと、 httpPOSTリクエストをサーバーに/join/usernameangular$httpで送信し、サーバーでこのPOSTリクエストを取得し、リダイレクトをブラウザーに送信します。

{ok, Req4} = cowboy_req:reply(303, [{"Location", <<"/chat.html">>}], <<"">>, Req3)
{:ok, req4, State}

応答ヘッダーをリダイレクトします。

 HTTP/1.1 303 See Other
 connection: keep-alive
 server: Cowboy
 date: Thu, 19 Sep 2013 14:36:01 GMT
 content-length: 0
 Location: /chat.html
 Cache-Control: no-store

リダイレクトを送信した後、「/chat.html」パスでブラウザから「GET」リクエストを受け取りました。問題ありません。chat.html を読み取ってブラウザに送り返しますが、ブラウザはそれをレンダリングせず、URL はブラウザで変更されません。ブラウザ コンソールに chat.html 200 が表示されます。

ブラウザが新しいページをレンダリングしないのはなぜchat.htmlですか?

更新 1。

手でブラウザに入力/join/usernameすると、通常どおりリダイレクトされます。なんで?

ありがとうございました。

4

1 に答える 1

0

$httpangularのサービスを使用してサーバーへの呼び出しを行っていると言います。これは、AJAX 呼び出しを行っていることを意味します。応答データは、呼び出しsuccessの作成時に指定したコールバックに送信され$httpます。この場合、応答データはchat.htmlファイルのペイロードになります。

$http({method: 'POST', url: '/join/username'}).
  success(function(data, status, headers, config) {
    // data will be the content from chat.html
  });

ブラウザーは、通常のナビゲーション フローの一部として要求を行っている場合にのみ、目に見える形でリダイレクトに従います。AJAX リクエストはリダイレクトに従いますが、結果はブラウザー ウィンドウに表示されず、代わりにコードに返されます。これが、ブラウザにアドレスを入力するとうまくいく理由です。

そのリダイレクトに従いたい場合は、HTML フォームを直接送信し/join/usernameて、Angular AJAX 呼び出しを取り除くことができます。

于 2013-09-19T23:00:41.910 に答える