Node.js-http模塊

HTTP 協議

概念
  • HTTP(hypertext transport protocol)協議;中文叫超文本傳輸協議,是一種基于TCP/IP的應用層通信協議
  • 這個協議詳細規定了 瀏覽器 和萬維網 服務器 之間互相通信的規則。
  • 協議中主要規定了兩個方面的內容
    • 客戶端:用來向服務器發送數據,可以被稱之為請求報文
    • 服務端:向客戶端返回數據,可以被稱之為響應報文
客戶端請求規范(請求報文組成)
1. 請求行
  • 由三部分組成:
    • 請求方法
    • 常用的請求方法
    • GET:獲取資源
    • POST:提交資源
    • PUT:更新資源
    • DELETE:刪除資源
    • HEAD:獲取資源的元信息
    • OPTIONS:獲取服務器支持的請求方法
    • 請求URL??:統一資源定位符
http://www.example.com:8080/path/to/resource?query=param#fragment
// 協議:http(https、ftp、ssh等) 通信協議
// 域名:www.example.com 服務器地址
// 端口:8080 端口號,默認端口號為80,可省略
// 路徑:/path/to/resource 資源位置
// 查詢參數:?query=param 用于向服務器傳遞額外信息
// 錨點:#fragment 頁面內定位(瀏覽器端使用),哈希(錨點鏈接)
  • HTTP 協議版本
  • 例如:HTTP/1.1或HTTP/2
2.請求頭
  • 采用鍵值對格式:頭名: 頭值
頭名作用示例
Host目標主機Host: www.example.com
User-Agent客戶端標識,用戶代理,客戶端字符串標識,服務器可以通過這個標識來識別這個請求來自User-Agent,哪個客戶端 ,一般在PC端和手機端的區分User-Agent: Mozilla/5.0
Accept可接收的響應類型Accept: text/html
Accept-Encoding可接受的壓縮編碼類型Accept-Encoding: gzip, deflate
Cookie客戶端存儲信息Cookie: session_id=abc123
Content-Type請求體類型Content-Type: application/json
Authorization身份驗證Authorization: Bearer token
Connection連接的設置 keep-alive(保持連接);close(關閉連接)Connection: keep-alive
Cache-Control緩存控制 max-age = 0 (沒有緩存)Cache-Control: no-cache
Upgrade-Insecure-Requests將網頁中的http請求轉化為https請求(很少用)老網站升級Upgrade-Insecure-Requests: 1
Accept-Language可接受的語言Accept-Language: en-US,en;q=0.9
3.空行
  • 用于分隔請求頭和請求體
4.請求體

包含客戶端發送給服務器的數據:
?- ?GET請求??:通常沒有請求體

  • ??POST/PUT請求??:包含表單數據、JSON、文件等
  • 用于向服務器提交數據,例如表單數據、JSON數據等。
  • 請求體的格式取決于請求頭中的Content-Type字段。
  • 常見的請求體格式有:
    • application/x-www-form-urlencoded:表單數據
    • multipart/form-data:文件上傳
    • 表單:name=John&age=30
    • JSON:{“name”: “John”, “age”: 30}
    • XML:John
服務端響應規范(響應報文組成)
1.狀態行(Status Line)
  • 由三部分組成:
    • HTTP協議版本
      • HTTP/1.1:HTTP協議版本號
    • 狀態碼(Status Code)
    //1xx  信息響應 ,請求已接收,繼續處理
    //2xx  成功響應,請求成功處理
    //3xx  重定向,需要進一步操作
    //4xx  客戶端錯誤,客戶端請求錯誤
    //5xx  服務器錯誤,服務器處理錯誤
    //例如:
    //200 OK:請求成功
    //301 Moved Permanently:永久重定向
    //404 Not Found:資源不存在
    //500 Internal Server Error:服務器內部錯誤
    
    • 狀態描述(Reason Phrase)
      • OK:請求成功
      • Not Found:請求的資源不存在
      • Internal Server Error:服務器內部錯誤
      • Bad Request:客戶端請求錯誤
      • Unauthorized:未授權
      • Forbidden:禁止訪問
  • 響應頭
    服務器返回的元數據信息
常見的響應頭作用示例
Content-Type響應體類型Content-Type: text/html;charset=utf-8,設置響應體的數據類型以及字符集,響應體為html,字符集utf-8
Content-Length響應體的長度,單位為字節Content-Length: 1234
Set-Cookie設置客戶端CookieSet-Cookie: session_id=abc123
Cache-Control緩存控制Cache-Control: max-age=3600
Location重定向目標Location: /new-path
  • 空行
    分隔響應頭和響應體的空行
  • 響應體
    服務器返回的實際內容
  • HTML頁面
  • JSON/XML數據
  • 圖片/視頻等二進制文件
  • JavaScript/CSS等資源

MIME類型處理
HTTP通過Content-Type頭指定數據的MIME類型

文件類型MIME類型說明
HTMLtext/html網頁內容
CSStext/css樣式表
JavaScriptapplication/javascript腳本
JSONapplication/json結構化數據
TEXTtext/plain文本
JPEGimage/jpeg圖片
PDFapplication/pdf文檔
XMLapplication/xmlXML數據
ZIPapplication/zip壓縮文件
GIFimage/gifGIF圖片
PNGimage/pngPNG圖片
SVGimage/svg+xmlSVG圖片
MP3audio/mpeg音頻
MP4video/mp4視頻

連接管理
HTTP協議支持不同的連接策略

  • ?HTTP/1.0??:短連接(每次請求新建連接)
  • ??HTTP/1.1??:持久連接(默認啟用Keep-Alive)
  • ??HTTP/2??:多路復用(多個請求共享一個連接)
  • ??HTTP/3??:QUIC協議(基于UDP的快速傳輸協議)
Node.js 創建 HTTP 服務

Node.js 內置的 http 模塊可以輕松創建高性能的 HTTP 服務器

// 1.導入 http 模塊
const http = require('http');//2. 創建服務對象 create 創建 server 服務
//request 意為請求. 是對請求報文的封裝對象, 通過 request 對象可以獲得請求報文的數據
//response 意為響應. 是對響應報文的封裝對象, 通過 response 對象可以設置響應報文
const server = http.createServer((req, res) => {// 設置響應頭//res.setHeader('Content-Type', 'text/plain');// 設置響應頭防止中文亂碼res.setHeader('content-type','text/html;charset=utf-8');// 發送響應res.end('哈哈哈Hello, World!\n');})
//3. 啟動服務器監聽指定端口
server.listen(3000, () => {console.log('服務啟動成功, 端口號為 3000')  
})

注意:

  • 1.響應內容中文亂碼的解決辦法
// 設置響應頭防止中文亂碼
res.setHeader('content-type','text/html;charset=utf-8');
  • 2.端口號被占用
    解決辦法:修改端口號
    在這里插入圖片描述

  • 3.HTTP 協議默認端口是 80 。HTTPS 協議的默認端口是 443, HTTP 服務開發常用端口有 3000,
    8080,8090,9000 等

獲取 HTTP 請求報文(請求對象 (request) 詳解)

想要獲取請求的數據,需要通過 request 對象

const server = http.createServer((req, res) => {// 1. 獲取請求方法const method = req.method; // GET, POST 等// 2. 解析請求URLconst url = new URL(req.url, `http://${req.headers.host}`);
//   URL {
//   href: 'http://localhost:3000/?a=1',
//   origin: 'http://localhost:3000',
//   protocol: 'http:',
//   username: '',
//   password: '',
//   host: 'localhost:3000',
//   hostname: 'localhost',
//   port: '3000',
//   pathname: '/',
//   search: '?a=1',
//   searchParams: URLSearchParams { 'a' => '1' },
//   hash: ''
// } url1111// 3. 獲取請求路徑const pathname = url.pathname; // 如:'/api/user'// 4. 獲取查詢參數const query = Object.fromEntries(url.searchParams);// 5. 獲取請求頭const contentType = req.headers['content-type'];// 6. 獲取請求體 (POST/PUT)let body = '';req.on('data', chunk => body += chunk);req.on('end', () => {console.log('請求體內容:', body);// 設置響應res.end(`請求方法: ${method}, 路徑: ${pathname}`);});
});

注意:

  • request.headers 將請求信息轉化成一個對象,并將屬性名都轉化成了『小寫』
  • 關于路徑:如果訪問網站的時候,只填寫了 IP 地址或者是域名信息,此時請求的路徑為『 / 』
  • 關于 favicon.ico:這個請求是屬于瀏覽器自動發送的請求
const http = require('http');
const server = http.createServer((req, res) => {// 獲取請求方法和路徑// const {method, url} = req;// console.log(req.url,'xxxxxxx') // /sm/api/user  http://localhost:3000/sm/api/user post// console.log(req.url,'xxxxxxx') // /  http://localhost:3000/ Get// console.log(req.url,'xxxxxxx') // /about  http://localhost:3000/about Getconst { method } = req;const url = new URL(req.url, `http://${req.headers.host}`);const pathname = url.pathname;// 設置響應頭res.setHeader('Content-Type', 'text/html; charset=utf-8');// 路由處理if (method === 'GET' && pathname === '/') {res.end('<h1>首頁</h1>');} else if (method === 'GET' && pathname === '/about') {res.end('<h1>關于我們</h1>');} else if (method === 'POST' && pathname === '/api/user') {// 處理API請求...res.end(JSON.stringify({ code: 200, data: { name: '蘇木' } }));} else {res.statusCode = 404;res.end('<h1>頁面不存在</h1>');}});server.listen(3000, () => {console.log('服務器已啟動,監聽端口 3000');});

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

設置 HTTP 響應報文(響應對象 (response) 詳解)
const server = http.createServer((req, res) => {// 1. 設置狀態碼res.statusCode = 200; // 默認200,可以設置為404等// 2. 設置響應頭res.setHeader('Content-Type', 'application/json');res.setHeader('Cache-Control', 'public, max-age=3600');// 3. 寫入響應內容(多次寫入)res.write('第一部分數據');res.write('第二部分數據');// 4. 結束響應并發送res.end('最后內容');// 5. 一次性寫入并結束// res.end(JSON.stringify({ message: 'Hello' }));
});
靜態文件服務

實現靜態資源服務器

const http = require('http');
const fs = require('fs');
const path = require('path');// MIME 類型映射
const mimeTypes = {'.html': 'text/html','.js': 'text/javascript','.css': 'text/css','.json': 'application/json','.png': 'image/png','.jpg': 'image/jpeg','.gif': 'image/gif','.svg': 'image/svg+xml',
};const server = http.createServer((req, res) => {// 獲取文件路徑 public 文件夾下的文件的靜態資源const filePath = path.join(__dirname, 'public', req.url);// 獲取文件擴展名const extname = path.extname(filePath);// 設置默認內容類型let contentType = mimeTypes[extname] || 'application/octet-stream';// 讀取文件fs.readFile(filePath, (err, data) => {if (err) {// 文件不存在if (err.code === 'ENOENT') {res.statusCode = 404;res.end('<h1>404 Not Found</h1>');} else {// 成功讀取文件res.setHeader('Content-Type', contentType);res.end(data);}});
});server.listen(9000);// 訪問: http://localhost:3000/232.png
// 結果如下

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87806.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java JDBC的初步了解

文章目錄 基本流程注冊驅動的兩種方法DriverManagerDriverManager 的核心作用核心原理自動注冊驅動的機制關鍵方法 示例代碼: 連接Mysql數據庫StatementPreparedStatement JDBC全稱Java DataBase Connectivity。 定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…

QT 第十二講 --- 控件篇 LineEdit,TextEdit與ComboBox

前言&#xff1a;歡迎進入 QT 控件世界的第十二講&#xff01;在上一講《QT 第十一講 --- 控件篇 LCDnumber&#xff0c;ProgressBar與CalenderWidget》中&#xff0c;我們探索了用于信息展示和狀態反饋的控件&#xff1a;精準的數字顯示器 LCD Number、直觀的進度指示器 Progr…

VSCode遇到的一些小毛病(自動保存、運行后光標不再處于編輯區)

1. 右鍵點擊Run Code沒有觸發自動保存 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾選你需要的 2. 運行后光標仍然處于編輯區&#xff08;容易誤輸入&#xff09; 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.單文件和項目&#xff08;多個 py 文件項目/模塊化&#xff09;# 在編寫代碼時&#xff0c;一般兩種模式&#xff0c;執行單個文件&#xff0c;或者執行一個完成項目&#xff08;包含多個 py 文件或者其它資源文件&#xff09;。 單文件模式&#xff1a;MaixVision 創建或者…

征信系統架構思想:打造商業信任基石_東方仙盟—仙盟創夢IDE

一、建設必要性在復雜的商業環境中&#xff0c;企業面臨多元交易對象與業務場景&#xff0c;準確評估合作方信用狀況及潛在價值的難度顯著增加。傳統經驗判斷和簡單背景調查存在局限性&#xff0c;難以滿足現代商業決策需求&#xff0c;因此構建科學的征信體系具有現實必要性。…

網安-XSS-pikachu

介紹 XSS&#xff0c;即跨站腳本攻擊&#xff0c;是指攻擊者利用Web服務器中的代碼漏洞&#xff0c;在頁面中嵌入客戶端腳本&#xff08;通常是一段由JavaScript編寫的惡意代碼&#xff09;&#xff0c;當信任此Web服務器的用戶訪問 Web站點中含有惡意腳本代碼的頁面&#xff…

算法入門——字典樹(C++實現詳解)

字典樹&#xff08;Trie&#xff09;是處理字符串匹配的高效數據結構&#xff0c;廣泛應用于搜索提示、拼寫檢查等場景。本文將帶你從零掌握字典樹的原理與實現&#xff01; 一、什么是字典樹&#xff1f; 字典樹&#xff08;Trie&#xff09;是一種樹形數據結構&#xff0c;…

SpringBoot整合SpringCache緩存

SpringBoot整合SpringCache使用緩存 文章目錄SpringBoot整合SpringCache使用緩存1.介紹2.SpringBoot整合1.導入xml依賴2.配置yml3.使用EnableCaching啟用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他屬性配置1.keyGenerator 屬性2. cacheManage…

WPF學習筆記(20)Button與控件模板

Button與控件模板一、 Button默認控件模板詳解二、自定義按鈕模板一、 Button默認控件模板詳解 WPF 中的大多數控件都有默認的控件模板。 這些模板定義了控件的默認外觀和行為&#xff0c;包括控件的布局、背景、前景、邊框、內容等。 官方文檔&#xff1a;https://learn.mic…

藍天居士自傳(1)

藍天居士何許人&#xff1f; 藍天居士是我的筆名&#xff0c;也可以說是號。就好像李白號青蓮居士、歐陽修號六一居士一樣。筆者本名彭昊 —— 一個有不少重名重姓者的名字。 筆者小的時候上語文課&#xff0c;無論是小學、初中抑或是高中&#xff0c;都會有魯迅&#xff08;…

短劇系統開發定制全流程解析:從需求分析到上線的專業指南

一、短劇行業數字化趨勢與系統開發必要性在短視頻內容爆發式增長的時代背景下&#xff0c;短劇作為一種新興的內容形式正在迅速崛起。數據顯示&#xff0c;2023年中國短劇市場規模已突破300億元&#xff0c;用戶規模達到4.5億&#xff0c;年增長率超過200%。這一迅猛發展的市場…

getBoundingClientRect() 詳解:精準獲取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一個強大的 DOM API&#xff0c;用于獲取元素在視口中的精確位置和尺寸信息。它返回一個 DOMRect 對象&#xff0c;包含元素的坐標、寬度和高度等關鍵幾何信息。 基本用法 const element document.getElementById(myElement); cons…

EXCEL 基礎技巧

來源&#xff1a;WPS 官網 初步了解WPS表格-WPS學堂https://www.wps.cn/learning/course/detail/id/635.html 1、格式刷 1.1使用格式刷隔行填充顏色。 首先設置部分表格顏色&#xff0c;選中此區域&#xff0c;雙擊點擊格式刷&#xff0c;然后選中其他表格區域。 這樣就可以…

【RK3568 編譯rtl8723DU驅動】

RK3568 編譯rtl8723DU驅動 編譯源碼1.解壓rtl8723du2.修改Makefile 驗證1.加載模塊2.開啟wifi 在驅動開發中&#xff0c;驅動的編譯與集成是實現設備功能的關鍵環節。本文聚焦于基于 RK3568 處理器平臺編譯 RTL8723DU WiFi/BT 二合一模塊驅動的完整流程&#xff0c;涵蓋源碼編譯…

基于Simulink的二關節機器人獨立PD控制仿真

文章目錄 理論模型仿真窗口控制函數目標函數仿真 本文是劉金琨. 機器人控制系統的設計與MATLAB仿真的學習筆記。 理論模型 對于二關節機器人系統&#xff0c;其動力學模型為 D ( q ) q C ( q , q ˙ ) q ˙ r D(q)\ddot qC(q,\dot q)\dot q r D(q)q?C(q,q˙?)q˙?r 式…

【技術架構解析】國產化雙復旦微FPGA+飛騰D2000核心板架構

本文就一款基于飛騰D2000核心板與兩片高性能FPGA的國產化開發主板進行技術解析&#xff0c;包括系統架構、主要硬件模塊、關鍵接口及軟件環境&#xff0c;重點闡述各子系統間的數據路徑與協同工作方式&#xff0c;旨在為行業內同類產品設計與應用提供參考。 隨著國產化要求的加…

Python 數據分析:計算,分組統計1,df.groupby()。聽故事學知識點怎么這么容易?

目錄1 示例代碼2 歡迎糾錯3 論文寫作/Python 學習智能體1 示例代碼 直接上代碼。 def grpby1():xls "book.xls"df pd.DataFrame(pd.read_excel(xls, engine"xlrd"))print(df)"""序號 分類 銷量0 1 文學 51 2 計算機…

【解決“此擴展可能損壞”】Edge瀏覽器(chrome系列通殺))擴展損壞?一招保留數據快速修復

引言 如果你想保留你的數據&#xff0c;敲重點&#xff1a;不要點擊修復&#xff0c;不要修復&#xff0c;不要修復 在使用 Microsoft Edge 瀏覽器時&#xff0c;您可能會遇到擴展程序顯示“此擴展程序可能已損壞”的提示&#xff0c;且啟用按鈕無法點擊。這一問題讓許多用戶感…

AI專業化應用加速落地,安全治理挑戰同步凸顯

7月2日&#xff0c;2025全球數字經濟大會在北京國家會議中心開幕。本屆大會以“建設數字友好城市”為主題&#xff0c;聚焦數字技術對城市發展的影響。開幕式上&#xff0c;一首完全由AI生成的MV成為焦點——從歌詞、譜曲、演唱到視頻制作全流程AI生成&#xff0c;展現人工智能…