httpプロトコル&リクエストパラメータの取得方法

32863 ワード

ターゲット
  • は、Webサーバ
  • を構築することができる.
  • は、GET、POSTのパラメータを取得することにより、パラメータ
  • を取得することができる.
  • は、ルーティング
  • の作成方法を把握することができる.
  • 同期非同期の概念
  • を知ることができる.
  • コールバック関数の概念
  • を知ることができる.
    サーバ側の基本概念
    サイトの構成
    Webアプリケーションは、クライアントとサーバの2つに大きく分けられます.
    **クライアント:**ブラウザで実行される部分は、ユーザーが見て対話するインタフェースプログラムです.HTML、CSS、JavaScriptを使用して構築します.
    **サーバ側:**サーバで実行される部分で、データの保存とアプリケーションロジックの処理を担当します.
    [外部チェーン画像の転送に失敗しました(img-W 8 uadwRU-156462670754)(images/fuwuqi-01.png)]
    Node Webサイトサーバ
    Webアクセスサービスを提供できるマシンは、クライアントのリクエストを受信し、リクエストに応答できるWebサーバです.
    [外部チェーン画像の転送に失敗しました(img-58 Dbba 93-156462670757)(images/fuwuqi-02.png)]
    IPアドレス
    インターネット内のデバイスの一意のID.IPはインターネットProtocol Addressの略で、インターネットプロトコルアドレスを代表する.
    [外部リンク画像転送失敗(img-YehHaHZE-1568462670762)(images/ip.png)]
    ドメイン名
    IPアドレスが覚えにくいため、ドメイン名の概念が生まれて、いわゆるドメイン名はふだんインターネットを利用して使うウェブサイトです
    http://www.itheima.com => http://124.165.219.100/アドレスバーにURLを入力しますが、最終的には指定したWebサーバにアクセスするためにドメイン名をipに変換します.
    ポート
    ポートを使用して異なるサービスを区別します.それは一定の範囲の数字で、範囲は0から65535で、外部にサービスを提供するソフトウェアごとに、1つのポートを占有します.
    [外部リンク画像の転送に失敗しました(img-IXrKApDq-156462670763)(images/duankou.png)]
    URL(★★★)
    統合リソースロケータは、URL(Uniform Resource Locator)とも呼ばれ、インターネット上のリソースの位置を識別するために設けられたアドレス方式で、私たちが普段言っているページアドレスはURLを指しています.
    URLの構成
    転送プロトコル://サーバIPまたはドメイン名:ポート/リソースの場所IDhttp://www.itcast.cn/news/20181018/09152238514.html
    http:HTMLページの公開と受信方法を提供するハイパーテキスト転送プロトコル.
    開発中のクライアントとサーバ側の説明
    開発段階では,クライアントとサーバ側が同じコンピュータ,すなわち開発者コンピュータを使用する.
    **ローカルドメイン名:*localhost**ローカルIP:*127.0.0.1
    Webサーバの作成(★★★)
  • システムモジュール
     const http = require('http');
    
  • を参照
  • webサーバ
    const app = http.createServer();
    
  • を作成する
  • クライアントが要求を送信とき(クライアントから送信された要求を傍受)
     app.on('request', (req, res) => {
            //    
           res.end('

    hi, user

    '
    ); });
  • .
  • 傍受ポート
    //   3000  
    app.listen(3000);
    console.log('      ,  3000  ,    localhost:3000')
    
  • HTTPプロトコル
    HTTPプロトコルの概念
    ハイパーテキスト転送プロトコル(英語:HyperText Transfer Protocol、略称:HTTP)は、Webサーバからローカルブラウザにハイパーテキストを転送する方法を規定しており、クライアントサーバアーキテクチャに基づいて動作し、クライアント(ユーザー)とサーバ側(Webサイト)の要求と応答の基準である.
    [外部チェーンピクチャの転送に失敗しました(img-FvF 9 Ejnz-156846267765)(images/httpプロトコル.png)]
    メッセージ
    HTTP要求と応答の過程で伝達されたデータブロックをメッセージと呼び、伝達するデータといくつかの付加情報を含め、所定のフォーマットを遵守しなければならない.
    [外部リンク画像の転送失敗(img-K 447 kV 9 o-156462670769)(images/メッセージ.png)]
    請求書
    要求方式(Request Method)
  • GET要求データ
  • POST送信データ
  • リクエストアドレス(Request URL)
     app.on('request', (req, res) => {
         req.headers  //       
         req.url      //       
         req.method   //       
     });
    

    メッセージに応答
    HTTPステータスコード
  • 200リクエスト成功
  • 404によって要求されたリソースは、
  • に見つかりませんでした.
  • 500サーバ側エラー
  • 400クライアント要求構文エラー
  • コンテンツの種類
  • text/html
  • text/css
  • application/javascript
  • image/jpeg
  • application/json
  •  app.on('request', (req, res) => {
         //       
         res.writeHead(200, {
             'Content-Type': 'text/html;charset=utf8‘
         });
     });
    

    HTTPリクエストとレスポンス処理
    リクエストパラメータ(★★)
    クライアントがサーバ側に要求を送信する場合、ログイン操作などの要求パラメータの形式でサーバ側に伝達する必要があるクライアント情報を携帯する必要がある場合があります.
    GET要求パラメータ
  • パラメータは、ブラウザのアドレスバーに配置されます.たとえば、次のようになります.http://localhost:3000/?name=zhangsan&age=20
  • パラメータ取得には、urlアドレス
  • を処理するためにシステムモジュールurlを用いる必要がある.
    const http = require('http');
     //   url         url  
     const url = require('url');
     const app = http.createServer();
     app.on('request', (req, res) => {
         //  url                
             // true             
         let {query} = url.parse(req.url, true);
         console.log(query);
     });
     app.listen(3000);
    

    POST要求パラメータ
  • パラメータは、送信
  • のために要求体に配置する.
  • POSTパラメータを取得するには、dataイベントおよびendイベント
  • を使用する必要がある.
  • querystringシステムモジュールを使用してパラメータをオブジェクトフォーマット
  • に変換
     //       querystring    HTTP         
     const querystring = require('querystring');
     app.on('request', (req, res) => {
         let postData = '';
         //         
         req.on('data', (chunk) => postData += chunk;);
         //           
         req.on('end', () => { 
             console.log(querystring.parse(postData)); 
         }); 
     });
     app.listen(3000);
    

    ルート(★★)
    http://localhost:3000/index http://localhost:3000/loginルーティングとは、クライアント要求アドレスとサーバ側プログラムコードとの対応関係を指す.簡単に言えば、何かに応答してほしいということです.
    [外部チェーン画像の転送失敗(img-YE 0 ZWeEB-156462670773)(images/ルーティング.png)]
    コアコード
    //            
     app.on('request', (req, res) => {
         //           
         let { pathname } = url.parse(req.url);
         if (pathname == '/' || pathname == '/index') {
             res.end('      ');
         } else if (pathname == '/list') {
             res.end('        ');
         } else {
            res.end('  ,          ');
         }
     });
    
    

    例demo
  • システムモジュールhttp
    //     
    const http = require('http');
    //  url   
    const url = require('url');
    
  • に導入
  • Webサーバの作成
    const app = http.createServer();
    
  • Webサーバオブジェクトに要求イベントを追加し、リスニングポート
    app.on('request', (req, res) => {
    	...
    }
    app.listen(3000);
    
  • を追加する.
  • ルーティング機能を実現
  • クライアントの要求方式
  • を取得する.
  • クライアントの要求アドレス
  • を取得する.
    //       
    	const method = req.method.toLowerCase();
    	//       
    	const pathname = url.parse(req.url).pathname;
    
    	res.writeHead(200, {
    		'content-type': 'text/html;charset=utf8'
    	});
    
    	if (method == 'get') {
    
    		if (pathname == '/' || pathname == '/index') {
    			res.end('      ')
    		}else if (pathname == '/list') {
    			res.end('       ')
    		}else {
    			res.end('         ')
    		}
    
    	}else if (method == 'post') {
    
    	}
    

    静的リソース
    サーバ側は処理を必要とせず,クライアントに直接応答できるリソースがCSS,JavaScript,imageファイルなどの静的リソースである.
    ダイナミックリソース
    同じリクエストアドレスの異なる応答リソース、このリソースは動的リソースです.
    クライアントリクエストパス
    GET方式
  • ブラウザアドレスバー
  • linkラベルのhrefプロパティ
  • scriptラベルのsrcプロパティ
  • imgラベルのsrcプロパティ
  • Form提出
  • POST方式
  • Form提出
  • Node.js非同期プログラミング
    同期APIと非同期API
    **同期API:**現在のAPIの実行が完了した場合のみ、次のAPIの実行を続行できます.
    console.log('before'); 
    console.log('after');
    

    **非同期API:**現在のAPIの実行は後続コードの実行をブロックしない
    console.log('before');
    setTimeout(
       () => { console.log('last');
    }, 2000);
    console.log('after');
    

    区別する
  • の戻り値は異なり、同期APIは戻り値からAPI実行の結果を得ることができるが、非同期APIはできない
  • である
    //   
    function sum (n1, n2) { 
          return n1 + n2;
    } 
    const result = sum (10, 20);
    //   
    function getMsg () { 
          setTimeout(function () { 
              return { msg: 'Hello Node.js' }
          }, 2000);
    }
    const msg = getMsg ();
    
  • コードの実行順序は、
  • 同期APIは上から下へ順次実行され、前のコードは後のコードの実行
  • をブロックする.
    for (var i = 0; i < 100000; i++) { 
        console.log(i);
    }
    console.log('for       ');
    
    
  • 非同期APIは、APIの実行が完了するのを待つことなく、コード
  • を下方に実行する.
    console.log('      '); 
    setTimeout(() => { console.log('2       ')}, 2000);
    setTimeout(() => { console.log('"0 "      ')}, 0); 
    console.log('      ');
    

    Node.jsのPromise
    Promiseが現れた目的はNodeを解決することだ.js非同期プログラミングにおける地獄へのコールバックの問題
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (true) {
                resolve({name: '  '})
            }else {
                reject('   ') 
            } 
        }, 2000);
    });
    promise.then(result => console.log(result); // {name: '  '})
           .catch(error => console.log(error); //    )
    
    

    非同期関数(★★)
    非同期関数は非同期プログラミング構文の究極の解決策であり、非同期コードを同期の形式に書くことができ、コードにコールバック関数のネストがなくなり、コードを明確にすることができます.
    asyncキーワード
    const fn = async () => {};
    async function fn () {}
    
  • 一般関数定義前にasyncキーワードを付ける一般関数は非同期関数
  • になる.
  • 非同期関数デフォルトはpromiseオブジェクト
  • を返します.
  • 非同期関数の内部でreturnキーワードを使用して結果を返すと、結果がラップpromiseオブジェクトのreturnキーワードがresolveメソッド
  • に代わる.
  • 非同期関数内部でthrowキーワードを用いるプログラム異常
  • を投げ出す.
  • 非同期関数再チェーン呼び出しthenメソッドを呼び出す非同期関数実行結果
  • を取得する.
  • 非同期関数再チェーン呼び出しcatchメソッドを呼び出す非同期関数実行のエラー情報
  • を取得する.
    awaitキーワード
  • awaitキーワードは非同期関数の
  • にのみ表示されます.
  • await promise awaitの後にpromiseオブジェクトしか書けない他のタイプのAPIを書くことはできません
  • awaitキーワードはpromiseが結果
  • を返すまで非同期関数を停止して下へ実行する.
    非同期関数の応用