HTTPはじめに
ハイパーテキスト転送プロトコル、ハイパーテキスト転送プロトコルの本は、ワールド・ワイド・ウェブのデータ通信規格の基礎となる要求と応答を指定します。
HTTPの作品
ステップHTTPリクエストとレスポンス
-
クライアントは、Webサーバーに接続します。TCPソケット接続を確立するために、HTTPクライアント、通常はブラウザ、HTTPポートとWebサーバ(デフォルトは80)。
-
HTTPリクエストを送信します。空白行の役割を含む4つの部分の要求ラインからのリクエスト・メッセージ、リクエストヘッダ、空白行と要求データはサービス終了を伝えることです、WebサーバーにTCPソケットクライアント要求メッセージを介してテキストを送信ダウン要求部分があります。
-
サーバーは要求を受け入れ、HTTPレスポンスを返します。Webサーバーは、要求されたリソースを見つけ、要求を解析します。リソースサーバのコピーは、クライアント側で読み取るTCPソケットを、書き込みます。応答状態からライン、頭部に応答して、データを4部に応答し、空白行。
-
接続のTCP接続を解除します。接続モードが近い場合、サーバはTCP接続を閉じ、クライアントは接続パッシブ解放TCP接続を閉じ;、その後、接続はしばらくの間維持されるキープアライブ接続モードならば、あなたは時間の要求を受信し続けることができます。
-
クライアントブラウザは、HTMLコンテンツを解析します。クライアントブラウザのステータス行は、要求が成功したステータスコードであることを確認するために、最初に解決しました。そして、HTML文書と文書数バイトの文字セットを通知するために、各レスポンスヘッダ、レスポンスヘッダを解析します。クライアントのブラウザは、そのHTML構文に従ってフォーマット、HTMLレスポンスデータを読み込み、ブラウザウィンドウに表示します。
URLを入力し、ブラウザのアドレスバーに何が起こったのか後に、Enterキーを押し
-
DNSサーバへのブラウザ要求は、IPアドレスに対応するURLのドメイン名を解決するために、
-
IPアドレスとデフォルトポート80、およびサーバーに応じてTCPコネクション確立のIPアドレスを解析した後、
-
問題HTTPリクエスト、サーバに第3のデータのTCPスリーウェイハンドシェイクパケットと要求パケットの読み出しファイルブラウザ(ファイルの後部に対応するURLのドメイン名)。
-
サーバーは、ブラウザのリクエストに応答し、ブラウザに対応したHTMLテキストを送信します。
-
TCPコネクションをリリース。
-
HTMLブラウザは、テキストを表示します。
リクエストメソッド
HTTP / 1.1プロトコルは、8つのメソッドCCPを定義し、それがアクションといえます
取得する
指定されたリソース要求を取得します。GETメソッドは、動作の「副作用」を生成するために使用すべきではない、読み出したデータに使用する必要があります。
役職
指定されたリソースデータに提出し、サーバーはその要求は、そのようなフォームを提出するか、ファイルをアップロードするなど、操作内容リソース伝送エンティティを処理します。
頭
メッセージヘッダを取得します。GETメソッドと同様に、サーバにリソース要求を指定されています。しかし、サーバーは、この記事のリソースセクションに戻されることはありません。その利点は、あなたが「リソースに関する情報」(あるいはメタ情報と呼ばれるメタデータ)を取得できるのすべての内容を転送することなく、このメソッドを使用することができるということです。
プット
リソースを更新し、最新の指定されたリソースの場所に自分のコンテンツをアップロードします。
DELETE
ファイルを削除し、サーバはRequest-URIによって識別されるリソースを削除することを要求します。
トレース
エコー要求は、主にテストや診断のために、サーバーが受信しました。
OPTIONS
これは、クライアントがサーバーのパフォーマンスを表示することができます。この方法では、サーバはすべてのHTTPリクエストメソッドをサポートするためのリソースを返すことができます。代わりに、リソース名の、OPTIONS要求がWebサーバーに送信されます「*」を使用すると、サーバーの機能が正常に動作しているテストすることができます。
CONNECT
HTTP / 1.1プロトコルは、プロキシサーバのパイプラインモードへの接続のために予約することができます。(暗号化されていないHTTPプロキシサーバを経由して)リンクは、一般的に使用されるSSL暗号化サーバです。
注意事項
-
メソッド名は大文字と小文字が区別されます。リソースの要求は、対応する要求メソッドをサポートしていない場合、サーバが認識していないか、対応するリクエストのメソッドをサポートしていない場合、サーバは、(方法許可されていない)ステータスコード405を返すべきステータスコード501を返すべきである(ません実装されています)。
-
HTTPサーバは、少なくともGETとHEADメソッドを実装する必要があり、他の方法はオプションです。すべてのメソッドは、彼らのセマンティックの定義と一致している必要があり実装されています。上記の方法に加えて、特定のHTTPサーバの拡張方法は、カスタマイズすることができます。例えばPATCH(RFC 5789で指定されたメソッド)リソースを変更するための局所適用のため。
GETとPOSTの違いは?
-
URL渡すパラメータをGET、リクエストボディでPOST中(リクエストのボディ)。
-
ブラウザがロールバックされ、POST要求を再提出する際、GETは無害です。
-
GET URLアドレスは、ブックマークを生成して、投稿しないことができます。
-
リクエストがアクティブキャッシュブラウザをされているGET、POSTしません、しない限り、手動で。
-
GETリクエストパラメータは、ブラウザの歴史の中で無傷である、とPOSTパラメータは保持されません。
-
(2キロバイト異なるブラウザは異なるものになります)URLの長さに渡されたリクエストパラメータが限定されてGETしないと、何のPOST。
-
パラメータのデータ型は、GETはASCII文字のみを受け入れますが、何の制限POSTはありません。
-
パラメータは、直接URLに露出しているため、POSTよりも安全GET、機密情報を送信するために使用することはできません。
-
リクエストが唯一のURLエンコードすることができGET - encodeURIComponentで()、およびPOSTは、複数のエンコーディングをサポートしています。
-
POST同じデータフォーマットクエリ文字列形式データのページの形で必要にXHRを介してシリアライズして、サーバーに送信される場合、文字列を作成する()関数をシリアル化することができ、すなわち、フォームの配列
HTTPステータスコード
最初の行の全てが互いにスペースで区切られた、それぞれ、HTTPステータスコードの現在のバージョン3桁のために、HTTPレスポンスステータスラインであり、フレーズの状態の説明。
ステータスコードは5つに分かれて総:
-
1XX ----サーバは、要求、さらに処理の必要性を受けています
-
2XX ----サーバ要求は、受信されたと理解され、処理されます
-
200:OK
-
206:「部分コンテンツ」レスポンス:クライアントは、レンジリクエストヘッダを持つ要求を送信取得、彼らだけは、URL上のリソースの一部を必要とすることが示され、サーバはそれを完了します。例えば:ビデオ・オーディオは、ビデオ/オーディオのアドレスの多くを再生するときは、通常は206を返さ
-
-
---- 3XXリダイレクション、その後の動作を実行する、進行する要求
-
301:永続的なリダイレクト、要求されたページは新しいURLに移動しました
-
302:一時的なリダイレクト
-
304:キャッシュは、サーバーは、サーバーを要求せず、ブラウザのキャッシュを直接使用することができます伝えます
-
-
4XX ----リクエストエラー、字句エラーを含むか、要求が実行できません
-
400:クライアントの構文エラー
-
401:要求の承認に失敗しました。
-
403:リソースへのアクセスを要求することができ禁止は禁止されています
-
404:ファイルが見つかりません、クエリまたはURL
-
-
サーバは、要求5XXを受け入れる中にエラーが発生しました----
-
500:サーバー予測できないエラー
-
501:「内部サーバーエラー」サーバーエラーが発生し、要求の実行およびサーバーでは、この時間は動作していません
-
503:現在のクライアントを扱うことができないサーバーは、一時的な過負荷やクラッシュを要求します
-
504:サーバが接続されていません
-
505:サーバがサポートしたり、指定されたHTTPリクエストヘッダのバージョンをサポートすることを拒否していません
-
RFC 2616には、「200 OK」、「404が見つかりません」などの状態を記述するフレーズを、お勧めしていますが、WEB開発プロセスは、カスタムステータスやカスタム情報を記述することができました。
URL紹介
ユニフォームリソースロケータ、ユニフォームリソースロケータ
作曲:
-
スキームのトランスポートプロトコル、例えばHTTP、FTP、HTTPS
-
URLレベルマークシンボルは
//
、固定します -
資格情報を必要なリソースへのアクセス(省略してもよいです)
-
サーバー(多くの場合、ドメイン名、時々、IPアドレスなど)
-
ポート番号(HTTPのデフォルト値ならば、デジタルで表される「:80」は省略することができます)
-
パス(パス内の各ディレクトリ名の間に「/」文字差)
-
クエリ、フォームパラメータは、(モードをGET、出発点として、「?」の文字、データ、通常はURLエンコードされたUTF8を分離するために、文字の競合を避けるために、各パラメータ「&」分離し、「=」パラメータ名質問)
-
断片。出発点として、「#」の文字、アンカー付き
http://www.jjzz.com:80/news/index.html?id=250&page=1
転送プロトコル:HTTPサーバー:www.jjzz.com
ポート:80パス:/news/index.htmlクエリ:?ID = 250&ページ= 1
HTTPリクエストとレスポンスのフォーマット
リクエストフォーマット要求
【注意】データセクションを要求しない要求パケットを取得します。
応答形式の応答
機能Webフレームワーク
-
(展開を使用して)uwsgiするWSGIのwsgiref(Pythonモジュール)を含むメッセージング、そこモジュール
-
リターンパス異なるコンテンツ
-
動的なデータを返します(レンダリングテンプレートの置換文字列)
これは、Webソケットサーバの本質です。
Webフレームワークの分類
図2は、ジャンゴ、機能3を実現することができます
フラスコは、2つの機能を実現することができます
竜巻は1,2、3機能を実現することができます
手書きのWebフレームワーク
ソケットサーバの基本モデル
インポートソケット サーバ= socket.socket() server.bind(( "127.0.0.1"、8005)) server.listen() 一方、1: CONN、ADDR = server.accept() 再= conn.recv(1024) プリント(再) conn.send(b'HTTP / 1.1 200 OK \ R \ n \ R \ NOK ') はconn.close()
リターンパス要求の異なるコンテンツ
インポートソケット サーバ= socket.socket() server.bind(( "127.0.0.1"、8005)) server.listen() 一方、1: CONN、ADDR = server.accept() 再= conn.recv(1024) プリント(再) URL = re.decode( "UTF-8")スプリット()[1]。 もしURL == "/インデックス": SE = '这里是インデックス' elifのURL == "/ホーム": SE = '这里の是ホーム' 他: SE = "这里是默认访问" conn.send(b'HTTP / 1.1 200 OK \ rを\ ncontent型:text / htmlの;のcharset = UTF-8 \ rを\ nをします\ r \ n ') conn.send(se.encode(' UTF-8' )) はconn.close()
機能バージョン
インポートソケット サーバ= socket.socket() server.bind(( "127.0.0.1"、8005)) server.listen() DEF指数(URL): RET = F '这里是{URL} 戻りret.encode ( "UTF-8") DEF家(URL): RET = F '这里是{URL} 戻りret.encode( "UTF-8") のLS = [( "/インデックス"、インデックス)、 ("/ホーム」、自宅)] 、一方1: CONN、ADDR = server.accept() 再= conn.recv(1024) プリント(再) URL = re.decode( "UTF-8")スプリット()[1]。 FUNC =なし LSでの私のために: もし私[0] == URL: FUNC = I [1] ブレーク もしFUNC: SE = FUNC(URL) 他: SE = "这里是默认访问" .encode( "UTF-8") conn.send(b'HTTP / 1.1 200 OK \ rを\ ncontent型:text / htmlの;のcharset = UTF-8) 'のR \ n個の\ r \ n \ conn.send(SE) はconn.close()
バージョンとHTMLファイル
輸入ソケット サーバー= socket.socket() server.bind(( "127.0.0.1"、8005)) server.listen() 指数DEF(): モード= 'RB'、 "index.htmlを"(オープンで)をf: RET = f.read() の戻りRETの デフホーム(): オープン( "home.html"と、モード= 'RB')としてf: RET = f.read() の戻りのRET のls = [ ( "/インデックス"、インデックス)、 ("/ホーム"、自宅)] しばらく1: CONN、ADDR = server.accept() 再= conn.recv(1024) 印刷(再) URL = re.decode(」 UTF-8" )。スプリット()[1] FUNC =なし LSにおけるiについて: もしI [0] == URL: FUNC = I [1] ブレーク の場合、FUNC: SE = FUNC() 他: SE = "这里是默认访问" .encode( "UTF-8") conn.send(B」 HTTP / 1.1 200 OK \ R \ ncontent型:テキスト/ HTML;のcharset = UTF-8 \ Rの\ n \ rをする\ n ') conn.send(SE) はconn.close()