HTTP/1.1プロトコルで指定されているHTTP要求方法は、オプション、get、head、post、put、delete、trace、connectです。その中で、投稿は一般にサーバーにデータを送信するために使用されます。
HTTPプロトコルはASCIIコードと、TCP/IPプロトコルに基づくアプリケーション層仕様によって送信されることがわかります。仕様は、HTTP要求を3つの部分に分割します:ステートライン、リクエストヘッド、およびメッセージの件名。以下に似ています:
<emod> <Repkest-url> <vision> <headers> <entity-body> </entity-body> </headers> </version> </request-url> </method> </method> </method > </method>
契約は、投稿で提出されたデータをエンティティボディに配置する必要があることを規定していますが、契約はデータを使用する必要があるものを指定していません。実際、開発者はメッセージサブジェクトの形式を自分で決定できます。
ただし、データが送信された場合、サーバーで成功することは意味があります。 Javaやそのフレームワークなどの一般的なサーバー言語は、一般的なデータ形式の自動分析の関数を構築しています。サーバーは通常、リクエストのコンテンツタイプのフィールドから学習され、リクエスト内のメッセージサブジェクトがリクエストでエンコードされている方法を学習し、サブジェクトを分析します。したがって、送信されたデータスキームを投稿する場合、コンテンツタイプとメッセージサブジェクトコーディングの2つの部分が含まれています。それらへの公式の紹介は次のとおりです。
アプリケーション/x-www-form-urlencodedこれは、データを送信する最も一般的な方法である必要があります。ネイティブフォームがブラウザのフォームの場合、Enctype属性が設定されていない場合、データはApplication/X-WWW-Form-Urlencodedによって送信されます。リクエストは次のものに似ています(この記事では、無関係なリクエストヘッダーは省略されています):
投稿http://www.example.com http/1.1content-type:application/x-www-forlem-urlencoded = utf-8tital = test&sub%5d = 1&sub%5d 5d = 2&sub% 5B%5D = 3
まず、コンテンツタイプはアプリケーション/X-WWW-Form-Urlencodedとして指定されています。ほとんどのサーバー言語は、この方法を適切にサポートしています。たとえば、PHPでは、['Title']がタイトルの価値を取得できます。
多くの場合、AJAXでデータを送信するとき、この方法も使用します。たとえば、jQueryのajaxであるコンテンツタイプのデフォルト値は、「アプリケーション/x-www-form-urlencoded; charset = utf-8」です。
MultiPart/Form-Dataこれは、データを投稿するもう1つの一般的な方法です。フォームを備えたファイルをアップロードするとき、フォームのエンジタイプをこの値に等しくする必要があります。リクエストの例を直接ご覧ください:
http://www.example.com --- webkitformaryrgkcby7qhfd3trwacontent-disposition:filename = chrome.pngcontent-type ... chrome.pngのコンテンツ...
この例はわずかに複雑です。まず、異なるフィールドを分割するために境界が使用されます。境界は非常に長く複雑です。次に、コンテンツタイプは、データがMutipart/Form-Dataによってエンコードされていることを示します。今回は要求された境界は何ですか。メッセージの件名は、各部分の数に応じて同様の構造に分割されます。 )。ファイルが送信されている場合、ファイル名とファイルタイプ情報も含まれています。メッセージサブジェクトは最終的に - boundary-で終了しました。 Mutipart/Form-Dataの詳細な定義については、RFC1867にアクセスして表示してください。
この方法は通常、ファイルをアップロードするために使用され、主要なサーバー言語にも適切なサポートがあります。
上記の2つの投稿データ方法は、ブラウザのネイティブサポートであり、ネイティブフォームは、この段階でこれら2つの方法のみをサポートしています。ただし、ますます多くのWebサイト、特にWebAppがすべてデータ相互作用にAJAXを使用するにつれて、開発により多くの利便性をもたらすために、新しいデータ送信方法を完全に定義できます。
アプリケーション/JSONコンテンツタイプのアプリケーション/JSONは、応答ヘッダーに間違いなく不慣れではありません。実際、ますます多くの人々がリクエストヘッドとして使用して、メインボディがシリアル化されたJSON文字列であることをサーバーメッセージに伝えています。 JSON仕様の人気により、低バージョンIEを除く主要なブラウザはJSON.Stringifyのネイティブであり、サーバー言語にもJSONに対処する機能があり、JSONは問題に遭遇しません。
JSON形式は、キー値よりも複雑な構造化データをサポートしています。これも便利です。数年前にプロジェクトを行ったとき、私が提出する必要があるデータレベルは非常に深いものでした。しかし、当時、私はJSON文字列を値として使用しましたが、それでもキー値のペアに入れられ、X-WWW-Form-Urlencodedでそれを提出しました。
GoogleのAngularJSのAJAX関数は、デフォルトでJSON文字列を送信することです。たとえば、次のコード:
var data = {'title': 'test'、 'sub':[1,2,3]};
最終的なリクエストは次のとおりです。
http://www.example.com http/1.1content-type:application/json;
このスキームは、特に安らかなインターフェイスに適した複雑な構造化データを簡単に送信できます。 Chrome独自の開発者ツール、Firebug、Fiddlerなどの主要なパッケージツールは、非常にフレンドリーなツリー構造でJSONデータを表示します。ただし、この方法をサポートしていないサーバー側の言語もあります。現時点では、自分で処理する必要があります。コンテンツタイプがリクエストヘッダーのアプリケーション/JSONである場合、php:// inputから元の入力ストリームを取得し、次にjson_decodeを取得します。いくつかのJavaフレームワークが始めました。
もちろん、AngularJは、X-WWW-Form-Urlencodedを使用してデータを送信するように構成することもできます。
テキスト/XMLXML-RPC(XMLリモートプロシージャコール)。これは、送信プロトコルとしてHTTPを使用し、XMLをエンコーディングメソッドとして使用するリモートコール仕様です。典型的なXML-RPCリクエストは次のとおりです。 /methodname> <params> <param> <bale> <i4> 41 </i4> </value> </params> </methodcall>
XML-RPCプロトコルはシンプルで機能に満ちており、さまざまな言語の実装が利用可能です。また、WordPressのXML-RPC API、検索エンジンのPingサービスなど、広く使用されています。 JavaScriptには、既存のXML-RPCサービスをサポートできるこの方法でのデータ相互作用をサポートする既製のライブラリもあります。しかし、私は個人的には、XML構造がまだ肥大化しすぎていると思います。