0

XMLHttpRequestサーバーに使用するJavascriptコードに取り組んでPOSTいます。

私のコードは次のようになります (そして、Google Chrome のブックマークレットから実行しています):

 var a = sometext; 
 var b = someOtherText; 
 var msg = "a=" + encodeURIComponent(a) + "&b=" + encodeURIComponent(b);
 var server = new XMLHttpRequest();
 server.open("POST", "http://localhost:3333", true);
 server.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 server.send(msg);

netcat を使用して、コンピューター (Windows 7) のポート 3333 でリッスンしています。コードを初めて実行すると、正常に動作し、netcat を実行しているコマンド プロンプトに、POST要求、すべてのヘッダー、および送信されたデータの正しい値が表示されます ( msg)。ただし、(開いている Web ページで) スクリプトを再度実行すると、コマンド プロンプトに新しい情報が表示されなくなります。これは、後のPOSTコマンドが失敗したことを意味すると思います (ただし、Chrome の JavaScript コンソールを見るとエラーはありません)。メッセージ)。netcat リスナーを再起動してスクリプトを再実行すると、最初の実行は正しく機能し、その後の実行は何もしません。

なぜこれが失敗するのかについてのアイデアはありますか?

EDIT: もう少しいじりましたが、localhostへの接続が閉じられていないようです(または何らかの形でserverオブジェクト用に予約されています)。スクリプトを実行したタブを閉じると、保持されていたリソースが解放され、スクリプトが再び機能します。

XMLHttpRequest が完了したらすぐに閉じるように指示する方法はありますか? そのためにヘッダーを追加しようとしましたが ( 'Connection: close')、許可されていないことがわかりました。また、リクエストを同期に変更してserver.abort()後で呼び出すことも試みましたが(その機能が正確に何をするかを説明する優れたドキュメントさえ見つかりませんでした)、役に立ちませんでした。1.1 の代わりに HTTP/1.0 を使用して接続するように指定する方法がわかりません。

何か案は?

4

1 に答える 1

2

あなたは、netcatを閉じて再起動するとうまくいくと言います。おそらく、最初の POST が切断された後にリスナーを再度開くように netcat を設定していない可能性があります。

このnetcatチートシート-Lによると、Windowsで使用できます。

-L: 聞き取りを強めます (Netcat の Windows バージョンでのみサポートされます)。このオプションにより、Netcat は、クライアントが切断された後に再びリッスンを開始する永続的なリスナーになります。

接続を閉じたい場合 (おそらくブラウザーがタイムアウトするまで自動的に閉じられません)、有効な HTTP response、おそらく最小限の Full-Response で応答"HTTP/1.0 200 OK\r\n\r\n")してみてください。

HTTP/1.1 リクエストに HTTP/1.0 で応答することは、ブラウザ (クライアント) が古いプロトコルを実装していると想定されている (下位互換性があるように作られている) ため、機能するはずです。HTTP/1.1 応答で応答することもできますが、接続は永続的であると見なされます(つまり、すぐには閉じられません)。

特に明記されていない限り、クライアントは、サーバーからのエラー応答の後でも、サーバーが永続的な接続を維持すると想定する必要があります。

編集:間違いを犯し、応答ではなく最小限の要求を使用しました。サーバーが (TCP) 接続を閉じなければならない場合があるため、応答を永続的なリスナーとして実装するのは実際には難しい場合があります。おそらく、netcat の「最小限の HTTP リスナー」を再作成するスクリプト(を使用せず-L、接続を再開するためにループする) の方がうまくいくのではないでしょうか? 次のステップは、ダミーの応答を提供する実際の HTTP サーバーを開始することです。これは、コンテンツを含む適切な形式の応答をテストする機会を与えるため、悪い考えではありません。

于 2012-09-07T01:40:45.180 に答える