1。オープニング分析
まず第一に、誰もが「HTTP」の概念に精通している必要があります。特定の言語に基づくのではなく、一般的なアプリケーションレイヤープロトコルです。言語によって異なる実装の詳細がありますが、それらは原則と一致しており、アイデアは同じです。
ホストランニング環境として、NodeJSはJavaScriptをホスト言語として使用し、独自の標準セットも実装しています。この記事では、「HTTPモジュール」について一緒に学びましょう。しかし、前提として、
公式ウェブサイトが最初に提供したAPIを読んで、予備的な理解を深めることができることを願っています。これにより、はるかに便利になります。以下は、HTTPパーツのAPIの概要です。
コードコピーは次のとおりです。
http
http.status_codes
http.createServer([requestListener])
http.createclient([port]、[host])
クラス:http.server
イベント:「リクエスト」
イベント:「接続」
イベント:「クローズ」
イベント:「CheckContinue」
イベント:「Connect」
イベント:「アップグレード」
イベント:「ClientError」
server.listen(port、[hostname]、[backlog]、[callback])
server.listen(path、[callback])
server.listen(ハンドル、[コールバック])
server.close([callback])
server.maxheadercount
server.settimeout(msecs、callback)
server.timeout
クラス:http.serverresponse
イベント:「クローズ」
respons.writecontinue()
Response.Writehead(StatusCode、[ReasonPhrase]、[Headers])
Response.settimeout(msecs、callback)
Response.StatusCode
Response.setheader(名前、値)
Response.headerssent
Response.senddate
Response.getheader(name)
Response.RemoveHeader(名前)
Response.Write(Chunk、[エンコード])
Response.addtrailers(ヘッダー)
Response.End([データ]、[エンコード])
http.request(options、callback)
http.get(オプション、コールバック)
クラス:http.agent
新しいエージェント([オプション])
agent.maxsockets
agent.maxfreesockets
agent.sockets
agent.freesockets
agent.requests
agent.destroy()
agent.getName(オプション)
http.globalagent
クラス:http.clientRequest
イベント「応答」
イベント:「ソケット」
イベント:「Connect」
イベント:「アップグレード」
イベント:「続行」
request.write(chunk、[encoding])
request.end([data]、[エンコード])
request.abort()
request.settimeout(timeout、[callback])
request.setNodelay([nodelay])
request.setsockepkeepalive([enable]、[initialdelay])
http.incomingmessage
イベント:「クローズ」
message.httpversion
message.headers
message.rawheaders
message.trailers
message.rawtrailers
message.settimeout(msecs、callback)
message.method
message.url
message.statuscode
message.socket
簡単な例から始めて、server.jsというファイルを作成し、次のコードを記述しましょう。
コードコピーは次のとおりです。
var http = require( 'http');
var server = http.createserver(function(req、res){
Res.WriteHeader(200、{
'content-type': 'text/plain; charset = utf-8' // charset = utf-8を追加します
});
res.End( "Hello、Big Bear!");
});
server.listen(8888);
console.log( "ポート8888で実行されているhttpサーバー...");
(node server.js)以下は実行結果です。
2。詳細な分析の例
この小さな例を見てみましょう。
(1行目):nodejsを介して付属する「http」モジュールを紹介し、http変数に割り当てます。
(2行):HTTPモジュールで提供される関数「CreateServer」を呼び出します。この関数は、新しいWebサーバーオブジェクトを返します。
パラメーター「requestListener」は、「リクエスト」イベントのリスニングキューに自動的に追加される関数です。
リクエストが届くと、イベントループはリスナーコールバック関数を実行キューに入れ、ノード内のすべてのコードが実行キューから1つずつ実行されます。
これらの実行はすべてワーカースレッド上にあります(イベントループ自体は独立したスレッドにあると見なすことができます。通常、このスレッドについては言及していませんが、ノードをコールしてシングルスレッド実行環境)。
すべてのコールバックは、ワーカースレッドで実行されます。
2つのパラメーター(リクエスト、応答)を提供するコールバック関数「RequestListener」を見てみましょう。
リクエストが受信されるたびにトリガーされます。各接続には複数のリクエストがある場合があることに注意してください(キープアライブ接続)。
「リクエスト」は、http.incomingmessageのインスタンスです。 「応答」は、http.serverresponseのインスタンスです。
HTTPリクエストオブジェクトは読み取り可能なストリームであり、HTTP応答オブジェクトは書き込み可能なストリームです。
「IncomingMessage」オブジェクトは、http.serverまたはhttp.clientRequestによって作成されます。
最初のパラメーターとして、それぞれ「リクエスト」イベントと「応答」イベントに渡します。
また、状態、ヘッダーファイル、および応答のデータにアクセスするためにも使用できます。
「ストリーム」インターフェイスと、次の追加のイベント、方法、プロパティを実装します。 (詳細については、APIを参照)。
(3行):「WriteHeader」、「Response.WriteHead()」関数を使用して、HTTPステータス200とHTTPヘッダーのコンテンツタイプ(コンテンツタイプ)を送信します。
リクエストヘッダーに返信します。 「StatusCode」は、404などの3ビットHTTPステータスコードです。最後のパラメーター「ヘッダー」は、応答ヘッダーのコンテンツです。
栗を取る:
コードコピーは次のとおりです。
var body = 'hello world';
Response.writehead(200、{
「コンテンツレングス」:body.length、
「コンテンツタイプ」:「テキスト/プレーン」
});
注:コンテンツレングスは、文字ではなくバイトで計算されます。
前の例の理由は、文字列「Hello World!」がシングルバイト文字のみが含まれています。
ボディにマルチバイトエンコード文字が含まれている場合、buffer.bytelength()を使用して、マルチバイト文字エンコードの場合の文字列のバイト数を決定する必要があります。
さらに、ノードは、コンテンツレンテ属性が送信された体の長さと一致するかどうかを確認しないことを説明する必要があります。
StatusCodeは、たとえば「404」など、3ビットHTTPステータスコードです。ここで話したいのは「http.status_codes」です。標準の「http」応答ステータスコードのすべてのセットと短い説明が含まれています。
以下はソースコードリファレンスです。
コードコピーは次のとおりです。
var status_codes = exports.status_codes = {
100:「続行」、
101:「スイッチングプロトコル」、
102:「処理」、// RFC 2518、RFC 4918で廃止
200:「OK」、
201:「作成」、
202:「受け入れ」、
203:「非承認情報」、
204:「コンテンツなし」、
205:「コンテンツのリセット」、
206:「部分コンテンツ」、
207:「マルチステータス」、// rfc 4918
300:「複数の選択」、
301:「永久に移動する」、
302:「一時的に動いた」、
303:「他を参照」、
304:「変更されていない」、
305:「プロキシを使用」、
307:「一時的なリダイレクト」、
400:「悪いリクエスト」、
401:「不正」、
402:「支払いが必要」、
403:「禁止」、
404:「見つかりません」、
405:「メソッドは許可されていない」、
406:「受け入れられない」、
407:「プロキシ認証が必要」、
408:「リクエストタイムアウト」、
409:「紛争」、
410: 'gone'、
411:「長さが必要」、
412:「前提条件が失敗した」、
413:「エンティティが大きすぎる」リクエスト」、
414:「リクエストウリが大きすぎる」、
415:「サポートされていないメディアタイプ」、
416:「満足できない要求範囲」、
417:「期待が失敗した」、
418: 'i/' ma teapot '、// rfc 2324
422:「未処理のエンティティ」、// RFC 4918
423:「ロック」、// rfc 4918
424:「依存の失敗」、// rfc 4918
425:「順序付けられていないコレクション」、// rfc 4918
426:「アップグレードが必要」、// RFC 2817
500:「内部サーバーエラー」、
501:「実装されていない」、
502不正なゲートウェイ'、
503:「サービスは利用できない」、
504:「ゲートウェイタイムアウト」、
505:「HTTPバージョンはサポートされていません」、
506:「バリアントも交渉します」、// RFC 2295
507:「不十分なストレージ」、// rfc 4918
509:「帯域幅の制限を超えた」、
510:「拡張されていない」// RFC 2774
};
nodejsソースコード「http.js」からの抜粋は、143行目から始まります。
実際、クライアントの応答結果から見ることは難しくありません。
(6行):「Response.End」------すべての応答ヘッダーとメッセージが送信されると、このメソッドは信号をサーバーに送信します。サーバーは、メッセージが完了していると考えます。
この方法は、各応答が完了した後に呼び出される必要があります。パラメーター「データ」が指定されている場合、「respons.write(data、encoding)」を最初に呼び出し、次に「respons.end()」を呼び出します。
(8行): "server.listen(8888)" -----サーバーは、指定されたハンドルとの接続を受け入れ、特定のポートにバインドします。
上記は、より詳細な分析プロセスであり、理解を深めることを望んでいます。コードはあまりありませんが、NodeJSアプリケーションを将来効率的に開発できるように、いくつかの詳細なメカニズムを理解することに焦点が当てられています。
3つ、例
「要求」オブジェクトを使用して要求ヘッダーデータにアクセスすることに加えて、「リクエスト」オブジェクトを読み取り専用データストリームとして使用して、リクエストボディデータにアクセスすることもできます。
「投稿」リクエストの例は次のとおりです。
コードコピーは次のとおりです。
http.createserver(function(request、response){
var body = [];
console.log(request.method);
console.log(request.headers);
request.on( 'data'、function(chunk){
body.push(chunk);
});
request.on( 'end'、function(){
body = buffer.concat(body);
console.log(body.toString());
});
})。聞きます(8888);
以下は、完全な「HTTP」要求データコンテンツです。
コードコピーは次のとおりです。
POST/HTTP/1.1
ユーザーエージェント:Curl/7.26.0
ホスト:LocalHost
受け入れる: */*
コンテンツレングス:11
コンテンツタイプ:Application/X-WWW-Form-Urlencoded
こんにちは世界
4つ、要約しましょう
(1)「HTTP」の概念を理解する。
(2)「HTTP」関連APIの使用に習熟しています。
(3)次のような詳細の制御に注意を払ってください。
(4)、「RequestListener」の理解。
(5)、概念を強調する:HTTPリクエストオブジェクトは読み取り可能なストリームであり、HTTP応答オブジェクトは書き込み可能なストリームです。