1. 程式人生 > >node.js http請求詳解和配置服務目錄

node.js http請求詳解和配置服務目錄

Node.js開發的目的就是為了用JavaScript編寫Web伺服器程式。因為JavaScript實際上已經統治了瀏覽器端的指令碼,其優勢就是有世界上數量最多的前端開發人員。如果已經掌握了JavaScript前端開發,再學習一下如何將JavaScript應用在後端開發,就是名副其實的全棧了。

HTTP協議

要理解Web伺服器程式的工作原理,首先,我們要對HTTP協議有基本的瞭解。如果你對HTTP協議不太熟悉,先看一看HTTP協議簡介

HTTP伺服器

要開發HTTP伺服器程式,從頭處理TCP連線,解析HTTP是不現實的。這些工作實際上已經由Node.js自帶的http模組完成了。應用程式並不直接和HTTP協議打交道,而是操作http

模組提供的requestresponse物件。

request物件封裝了HTTP請求,我們呼叫request物件的屬性和方法就可以拿到所有HTTP請求的資訊;

response物件封裝了HTTP響應,我們操作response物件的方法,就可以把HTTP響應返回給瀏覽器。

用Node.js實現一個HTTP伺服器程式非常簡單。我們來實現一個最簡單的Web程式hello.js,它對於所有請求,都返回Hello world!

'use strict';

// 匯入http模組:
var http = require('http');

// 建立http server,並傳入回撥函式:
var server = http.createServer(function
(request, response) {
// 回撥函式接收request和response物件, // 獲得HTTP請求的method和url: console.log(request.method + ': ' + request.url); // 將HTTP響應200寫入response, 同時設定Content-Type: text/html: response.writeHead(200, {'Content-Type': 'text/html'}); // 將HTTP響應的HTML內容寫入response: response.end('<h1>Hello world!</h1>'
); }); // 讓伺服器監聽8080埠: server.listen(8080); console.log('Server is running at http://127.0.0.1:8080/');

在命令提示符下執行該程式,可以看到以下輸出:

$ node hello.js 
Server is running at http://127.0.0.1:8080/

不要關閉命令提示符,直接開啟瀏覽器輸入http://localhost:8080,即可看到伺服器響應的內容:

http-hello-sample

同時,在命令提示符視窗,可以看到程式列印的請求資訊:

GET: /
GET: /favicon.ico

這就是我們編寫的第一個HTTP伺服器程式!

檔案伺服器

讓我們繼續擴充套件一下上面的Web程式。我們可以設定一個目錄,然後讓Web程式變成一個檔案伺服器。要實現這一點,我們只需要解析request.url中的路徑,然後在本地找到對應的檔案,把檔案內容傳送出去就可以了。

解析URL需要用到Node.js提供的url模組,它使用起來非常簡單,通過parse()將一個字串解析為一個Url物件:

'use strict';

var url = require('url');

console.log(url.parse('http://user:[email protected]:8080/path/to/file?query=string#hash'));

結果如下:

Url {
  protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?query=string',
  query: 'query=string',
  pathname: '/path/to/file',
  path: '/path/to/file?query=string',
  href: 'http://user:[email protected]:8080/path/to/file?query=string#hash' }

處理本地檔案目錄需要使用Node.js提供的path模組,它可以方便地構造目錄:

'use strict';

var path = require('path');

// 解析當前目錄:
var workDir = path.resolve('.'); // '/Users/michael'

// 組合完整的檔案路徑:當前目錄+'pub'+'index.html':
var filePath = path.join(workDir, 'pub', 'index.html');
// '/Users/michael/pub/index.html'

使用path模組可以正確處理作業系統相關的檔案路徑。在Windows系統下,返回的路徑類似於C:\Users\michael\static\index.html,這樣,我們就不關心怎麼拼接路徑了。

最後,我們實現一個檔案伺服器file_server.js

'use strict';

var
    fs = require('fs'),
    url = require('url'),
    path = require('path'),
    http = require('http');

// 從命令列引數獲取root目錄,預設是當前目錄:在NodeJS中可以通過process.argv獲取命令列引數。但是比較意外的是,node執行程式路徑和主模組檔案路徑固定佔據了argv[0]和argv[1]兩個位置,而第一個命令列引數從argv[2]開始
var root = path.resolve(process.argv[2] || '.');

console.log('Static root dir: ' + root);

// 建立伺服器:
var server = http.createServer(function (request, response) {
    // 獲得URL的path,類似 '/css/bootstrap.css':
    var pathname = url.parse(request.url).pathname;
    // 獲得對應的本地檔案路徑,類似 '/srv/www/css/bootstrap.css':
    var filepath = path.join(root, pathname);
    // 獲取檔案狀態:
    fs.stat(filepath, function (err, stats) {
        if (!err && stats.isFile()) {
            // 沒有出錯並且檔案存在:
            console.log('200 ' + request.url);
            // 傳送200響應:
            response.writeHead(200);
            // 將檔案流導向response:
            fs.createReadStream(filepath).pipe(response);
        } else {
            // 出錯了或者檔案不存在:
            console.log('404 ' + request.url);
            // 傳送404響應:
            response.writeHead(404);
            response.end('404 Not Found');
        }
    });
});

server.listen(8080);

console.log('Server is running at http://127.0.0.1:8080/');

沒有必要手動讀取檔案內容。由於response物件本身是一個Writable Stream,直接用pipe()方法就實現了自動讀取檔案內容並輸出到HTTP響應。

在命令列執行node file_server.js /path/to/dir,把/path/to/dir改成你本地的一個有效的目錄,然後在瀏覽器中輸入http://localhost:8080/index.html

http-index-page

只要當前目錄下存在檔案index.html,伺服器就可以把檔案內容傳送給瀏覽器。觀察控制檯輸出:

200 /index.html
200 /css/uikit.min.css
200 /js/jquery.min.js
200 /fonts/fontawesome-webfont.woff2

第一個請求是瀏覽器請求index.html頁面,後續請求是瀏覽器解析HTML後傳送的其它資源請求。

相關推薦

node.js http請求配置服務目錄

Node.js開發的目的就是為了用JavaScript編寫Web伺服器程式。因為JavaScript實際上已經統治了瀏覽器端的指令碼,其優勢就是有世界上數量最多的前端開發人員。如果已經掌握了JavaScript前端開發,再學習一下如何將JavaScript應用在後端開發,就是名副其實的全棧了。 HTTP

Charles抓取http請求

linu 代理ip 端口號 容易 execute gpo 情況 HA nts 使用過Charles進行抓包,但一直也沒有總結過,今天講講Charles如何進行抓包,修改請求,修改返回值。 一、Charles介紹 Charles是一款跨平臺的抓包工具,windows,ma

爬蟲學習筆記(二)http請求

not found 上傳 取數 found 語法錯誤 爬蟲學習 訪問 request 永久 上篇博客裏面寫了,爬蟲就是發http請求(瀏覽器裏面打開發送的都是http請求),然後獲取到response,咱們再從response裏面找到想要的數據,存儲到本地。 咱們本章就來說

跨域發送HTTP請求

ext open author read stat 請求 buffere keyset post ------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑------------- 本篇博客講述幾種跨域發HTTP請求的幾種方

Node.js Log4js使用

log4js-node是log4js的Node.js版本。 log4js-node的使用比較簡單,以下內容主要部分來自官方文件。 https://github.com/log4js-node/log4js-node Installation npm install log

node.js事件events

nodejs基於事件驅動 事件釋出,事件訂閱 大多數 Node.js 核心 API 構建於慣用的非同步事件驅動架構,其中某些型別的物件(又稱觸發器,Emitter)會觸發命名事件來呼叫函式(又稱監聽器,Listener)。同步函式,非同步觸發,通過回撥函式處理

SpringBoot(二) 主程式配置檔案如何配置

SpringBoot主程式詳解 1 /** 2 * @SpringBootApplication 來標註一個主程式類,說明這是一個Spring Boot應用 3 */ 4 @SpringBootApplication 5 public class HelloWorldMainAp

HTTP請求

一個HTTP請求報文由四個部分組成:請求行、請求頭部、空行、請求資料 1.請求行   請求行由請求方法欄位、URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔。比如 GET /data/info.html HTTP/1.1 方法欄位就是HTTP使用的請求方

Android 網路請求登入後更新頁面實現 Handler+HTTP請求

為了實現登入功能,我們需要一下幾步:1、獲取UI資料,並向伺服器傳送請求2、等待返回資料,解析3、將返回資料更新到UI執行緒中為了完成以上幾步,我根據每步的功能提出自己的解決方法,順便整理出對應的知識供大家參考。Handler眾所周知,Android程式執行會開啟一個UI執行

node.js學習1.0-安裝配置

 1、開啟NodeJS的官網,下載和自己系統相配的NodeJS的安裝程式,包括32位還是64位一定要選擇好,否則會出現安裝問題。          我選擇的是Window版本64位的安裝程式,也有MAC平臺的安裝程式。     下載完成,如圖:     2、接下來就是安裝了,

Node.js websocket/ws

前言 眾所周知,HTTP協議是一種無狀態、無連線、單向的應用層協議,只能由客戶端發起請求,服務端響應請求。 這就顯示了一個明顯的弊端:服務端無法主動向客戶端發起訊息,一旦客戶端需要知道服務端的頻繁狀態變化,就要由客戶端盲目地多次請求以獲得最新地狀態,這

CentOS 7中firewall防火牆配置以及切換為iptables防火牆

原文連結:http://blog.csdn.net/xlgen157387/article/details/52672988 一、firewall介紹 CentOS 7中防火牆是一個非常的強大的功能,在CentOS 6.5中在iptables防火牆中進行了升級了。

JavaEE基礎(03):Http請求,握手揮手流程簡介

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Http協議簡介 1、概念說明 HTTP超文字傳輸協議,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議,基於TCP/IP通訊協議來傳遞資料:HTML檔案、圖片、查詢資料等。HTTP協議基於客戶端-服務端架構模式。瀏覽器作為HTTP客

Http配置文件Telnet的使用

http telnet Http端口定義:0-1023:永久分配給固定的應用使用,特權端口1024-41951:也是註冊端口,要求不嚴格41952+:客戶端隨即使用的端口,動態端口,或私有端口BSD Socket : IPC的一種實現,允許位於不同主機上的進程之間進行通訊Socket API(封裝了內

http請求 headers 中的配置

1.Accept 指定客戶端能夠接收的內容型別,內容型別中的先後次序表示客戶端接收的先後次序. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 2.

HTTP請求方式GETPOST的區別

HTTP有兩部分組成:請求與響應,下面分別整理。 一.HTTP請求 1.HTTP請求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP請

Node.js http伺服器搭建傳送http的get,post請求

1.Node.js 搭建http伺服器 1.1建立server.js var http = require('http'); var querystring = require('query

Node.js中package.json中庫的版本號(^~區別)

當我們檢視package.json中已安裝的庫的時候,會發現他們的版本號之前都會加一個符號,有的是插入符號(^),有的是波浪符號(~)。那麼他們到底有什麼區別呢?先貼一個例子,對照例子來做解釋: "dependencies": { "bluebird": "^3.3.4", "body-parser": "

JS中的showModelDialog實例

cti 信息 創建 字符 非模態窗口 tle cin dialog ima 1.<a href="#" onclick="SeePic(‘${list.PATH}‘)"><font color="blue">預覽</font></a

(轉)關於Tomcat的點點滴滴(體系架構、處理http請求的過程、安裝配置目錄結構、設置壓縮對中文文件名的支持、以及Catalina這個名字的由來……等)

https 設置 重啟 specific 調用 持久化數據 所在 original apps 轉自:http://itfish.net/article/41668.html 總結Tomcat的體系架構、處理http請求的過程、安裝和配置、目錄結構、設置壓縮和對中文文件名