3

全て、

POST で Ajax リクエストを使用して、大きな JSON 文字列をサーバーに送信したいと考えています。以前に Ajax+POST を実行したことがない (GET のみ) ため、Web で情報を探しました。私を混乱させているのは、いくつかのリソースがこれらの3行を含めるように言っていることです:

request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");

他の人は、最初の ( ) を使用するだけだと言いますContent-type。では、その3つは必要ですか?彼らは何をしますか?

4

2 に答える 2

4

コンテンツ タイプ

これは、リクエスト本文で送信するデータのタイプ (つまり、POST データ) をサーバーに示します。質問の値はapplication/x-www-form-urlencoded、入力データがキーと値の形式で送信される HTML フォームの送信に使用されます。例:

xmlHttp.send("firstName=bob&lastName=Smith&age=43")

特殊文字がフォーマットを壊さないように、値はURL エンコード(別名、パーセント エンコード) する必要があります。コンテンツ タイプを設定せずに POST リクエストでこのタイプのデータを送信すると、ほとんどのサーバーはデータ タイプを検出して処理します。常に必要というわけではありませんが、設定することをお勧めします (あいまいさはありません)。

JSON データは として送信できapplication/x-www-form-urlencodedます。キーを使用して値を JSON に設定するだけです。

myData={"firstName":"bob","age":"43"}

上記の JSON は、使用できる Javascript で URL エンコードする必要があります。encodeURIComponent()この例では、人間が読めるようにするためにエンコードしていません。これは、POST データを送信するための最も一般的な形式であり、ほとんどのサーバー側言語は、キーと値のペアを自動的に解析して、何らかの種類のネイティブ配列または構造にします。

または、キーやその他のデータ ラベルを付けずに、JSON をリクエスト ボディとしてそのまま送信することもできます。例:

xmlHttp.send('{"firstName":"bob","age":"43"}');

この方法を使用して Content-type を に設定する必要がありapplication/jsonますが、ほとんどのサーバーはこれを設定せずに処理します。HTTP 要求に関する限り、それは単なるテキスト データだからです。サーバー側では、生の POST データにアクセスして JSON を取得する必要があります。ほとんどのサーバー側言語では、未加工の投稿データにアクセスできます。

コンテンツの長さ

content-type と同様に、content-length を設定することをお勧めします。送信しているデータの量をサーバーに伝えるため、サーバーはすべてのデータをいつ受信したかを簡単に知ることができます。そうは言っても、設定されていなくても通常は問題は発生しませんが、W3 ドキュメントでは使用すべきであると述べられています。

接続: 閉じる

接続ヘッダーの送信closeは、サーバーに対して、サポートしていないこと、または要求に永続的な接続を使用したくないことを示します。サーバーはヘッダーで応答する場合がありますがConnection: Keep-alive、これはクライアントに接続を開いたままにしておくように指示するものではなく、Persistent Connectionsをサポートしていることをクライアントに示すだけです。永続的な接続により、リクエストごとに開いたり閉じたりするのではなく、複数のリクエストに対して同じ TCP 接続を再利用できます。ajax リクエストでこのヘッダーを設定する必要はありません。設定しない場合は、ブラウザが判断して設定します。

概要

要約するConnectionと、必要ありませんが、Content-length使用する必要があります。Content-type使用する必要がありますが、サーバーとサーバー側のコードによっては、おそらく必要ありません。

于 2013-06-19T21:36:28.530 に答える
0

リクエストオブジェクトを「開く」ときにそれを行います:

request.open("POST", <url>);
于 2013-06-08T03:29:06.833 に答える