HTTP模塊(一)

HTTP服務

本小節主要講解HTTP服務如何創建服務,查看HTTP請求&響應報文,還有注意事項說明,另外講解本地環境&Node環境&瀏覽器之間的鏈路圖示,如何提取HTTP報文字符串,及報錯信息查詢。

創建HTTP服務端

const http = require('http');const server = http.createServer((request, response) => {response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服務已啟動');
});

瀏覽器輸入http://127.0.0.1:9000/,可以看到node服務終端窗口打印日志:服務已啟動。

查看報文

打開Fiddler,可以看到瀏覽器發送的請求報文和響應報文。

請求報文:

GET http://127.0.0.1:9000/favicon.ico HTTP/1.1
Host: 127.0.0.1:9000
Connection: keep-alive
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
sec-ch-ua-platform: "Windows"
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: http://127.0.0.1:9000/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
(空格)

響應報文:

HTTP/1.1 200 OK
Date: Fri, 28 Jun 2024 06:07:06 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Content-Length: 17Hello Http Server
鏈路
本地環境 Node服務器 瀏覽器 const http = require('http') createServer((req, res) => res.end('Hello Http Server')) listen(9000, () => console.log('服務已啟動')) GET / HTTP/1.1 HTTP/1.1 200 OK Hello Http Server 本地環境 Node服務器 瀏覽器
  1. 引入http模塊:const http = require('http'); 這行代碼引入了Node.js的內置http模塊,該模塊提供了創建HTTP服務器的功能
  2. 創建服務器:http.createServer() 方法用于創建一個HTTP服務器。它接受一個回調函數作為參數,該回調函數會在每次有請求到達服務器時被調用。回調函數有兩個參數:requestresponse,分別代表請求對象和響應對象。
  3. 處理請求和響應:在這個例子中,當服務器接收到任何請求時,都會執行回調函數 (request, response) => { response.end('Hello Http Server'); }。這意味著無論你向服務器發送什么請求,它都會簡單地結束響應,并向客戶端發送字符串'Hello Http Server'作為響應體。
  4. 監聽端口:server.listen(9000, () => { console.log('服務已啟動'); }); 這段代碼讓服務器開始監聽9000端口。一旦服務器成功啟動并開始監聽指定端口,就會在控制臺打印出 ‘服務已啟動’。這意味著你的HTTP服務器現在正在監聽本機的9000端口,等待接收HTTP請求。
  5. 瀏覽器訪問:通過在瀏覽器中輸入 http://localhost:9000 來訪問這個本地運行的Node.js服務器。瀏覽器會發送一個HTTP請求到這個地址,你的服務器會接收到這個請求,并返回'Hello Http Server' 的消息,這將在瀏覽器窗口中顯示出來。

停止HTTP服務

當前命令行(終端)ctrl+C

更新HTTP服務

停止服務后,重新執行node腳本。(暫時)

注意事項

亂碼

response不能返回中文,否則出現亂碼,后續通過字符集處理。

const server = http.createServer((request, response) => {response.set('content-type', 'text/html;charset-utf-8');response.end('你好');
});
端口占用
Error: listen EADDRINUSE: address already in use :::9000
結束端口
  1. cmd netstat -aon|findstr "8080"
  2. 復制返回當前端口的pid進程號,比如是16712
  3. taskkill /pid 是16712 /f
  4. 終端打印成功:已終止PID為16712的進程
更改端口
server.listen(9001, () => {console.log('服務已啟動');
});

默認端口

HTTP協議80是默認的端口,HTTP服務常用端口有3000,8080,900080端口的好處是簡化訪問過程,用戶在瀏覽器中輸入網址時無需指定端口號,因為瀏覽器默認使用80端口進行HTTP請求。還可以減少配置需求,無需額外配置端口映射或轉發等。

請求行 & 請求頭

const http = require('http');const server = http.createServer((request, response) => {// 獲取請求方法console.log(request.method);// 獲取請求的urlconsole.log(request.url);// 獲取請求的版本號console.log(request.httpVersion);// 獲取Http的請求頭console.log(request.headers);response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服務已啟動');
});

響應行

const http = require('http');const server = http.createServer((request, response) => {// 1. 申明let body = '';// 2. 綁定事件// 2.1 request本身就是可讀流對象// 2.2 當請求體的數據到來時,會觸發'data'事件。這里通過監聽這個事件,將接收到的數據塊chunk(Buffer類型)拼接到body字符串上。這是因為HTTP請求體可能分多個數據包到達,'data'事件可能觸發多次,每次傳遞一部分數據。request.on('data', chunk => {body += chunk;});// 3. 綁定endrequest.on('end', () => {console.log('body', body);})response.end('Hello Http Server');
});
// 使用listen方法指定服務器監聽的端口號(本例中為9000)
server.listen(9000, () => {console.log('服務已啟動');
});

由于get請求body中是不帶信息的,所以新建html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="http://127.0.0.1:9000" method="post"><input type="text" name="username"><input type="text" name="password"><input type="submit" value="提交"></form>
</body>
</html>

在這里插入圖片描述
點擊提交,控制臺輸出:
在這里插入圖片描述
終端打印:

在這里插入圖片描述

提取 http 報文字符串

url.parse 提取
const http = require('http');const url = require('url');const server = http.createServer((request, response) => {// 解析request.url// console.log('request', request.url);let res = url.parse(request.url, true);console.log('res', res);// 路徑let pathName = res.pathName;// 查詢字符串let keyword = res.query.keyword;response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服務已啟動');
});
new URL 構造函數提取
const http = require('http');const server = http.createServer((request, response) => {let url = new URL(request.url, 'https://www.baidu.com');console.log('url', url);// 輸出路徑console.log('pathName', url.pathname);// 取出傳參 這里以keyword為例console.log(url.searchParams.get('keyword'))response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服務已啟動');
});
new URL(input[, base])

new URL(input[, base]) 是一個 JavaScript 構造函數,用于從給定的輸入字符串(input)創建一個新的 URL 對象。這個函數允許你以一種標準化的方式解析和操作網址。

  • input:這個參數是一個字符串,代表想要解析成URL對象的地址信息,它可以是絕對地址(如https://www.baidu.com/serach?keyword=1),也可以是相對網址(如path/to/page?keyword=1),如果提供的是相對地址,那么解析時就需要用到base參數。
  • base(可選參數):基準URL,當input是一個相對網址時,例如,如果 basehttps://www.example.com/,并且 inputpath/to/page,那么最終解析得到的完整 URL 就會是 https://www.example.com/path/to/page。如果 input 是一個絕對網址,那么 base 參數將被忽略,即使提供了也不會影響結果。

建議使用new URL,因為url.parse在Node.js v22.3.0版本被棄用了。

Node.js 中文網

常見報錯信息:
錯誤代碼說明
ERR_INVALID_PROTOCOL表示提供的URL協議部分無效或不受支持。
ERR_UNKNOWN_URL_SCHEME遇到了未知的URL方案(協議),即URL的開頭部分沒有被識別
ERR_INVALID_CHARURL中包含了無效的字符
ERR_FILE_NOT_FOUND嘗試訪問的文件不存在(在涉及文件系統操作時)
ERR_HTTP2_PROTOCOL_ERRORHTTP/2協議層面的錯誤
ERR_TLS_CERT_ALTNAME_INVALIDTLS證書的備用名稱不匹配或無效
ERR_SSL_PROTOCOL_ERRORSSL/TLS握手過程中發生協議錯誤。
ERR_SOCKET_CLOSED套接字意外關閉,可能是因為網絡問題或遠程端點主動關閉連接
ERR_CONNECTION_REFUSED連接被目標主機拒絕,通常是由于目標端口無服務監聽
ERR_CONNECTION_TIMED_OUT連接嘗試超時,沒有在預定時間內收到響應
ERR_ABORTED請求被用戶或程序主動中斷

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

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

相關文章

lspci

【原】Linux之PCIE三種空間解析 PCIe學習筆記——2.PCIe配置空間 PCIE學習&#xff08;2&#xff09;PCIE配置空間詳解 開發者分享 | 使用 lspci 和 setpci 調試 PCIe 問題 b : 字節 w&#xff1a;word L&#xff1a; 4byte

LLM - 詞表示和語言模型

一. 詞的相似度表示 (1): 用一系列與該詞相關的詞來表示 (2): 把每個詞表示一個獨立的符號(one hot) (3): 利用該詞上下文的詞來表示該詞 (3): 建立一個低維度的向量空間&#xff0c;用深度學習方法將該詞映射到這個空間里(Word Embedding) 二&#xff1a;語言模型 (1): 根…

Postman中數據文件的高效使用:測試自動化與數據驅動測試實踐

摘要 Postman 是一個強大的 API 開發工具&#xff0c;它不僅支持 API 的設計、開發和測試&#xff0c;還提供了數據驅動測試的功能。通過使用數據文件&#xff0c;我們可以模擬不同的測試場景&#xff0c;實現測試的自動化和重復執行。本文將詳細介紹如何在 Postman 中使用數據…

PHP-實例-CSRF

1 需求 按照用途分類&#xff1a; 會話&#xff08;會話ID和會話令牌 二選一&#xff09; 會話ID&#xff1a;服務器側自動生成&#xff0c;自動存儲在cookie中&#xff0c;需要在服務器側存儲會話令牌&#xff1a;服務器側手動生成&#xff0c;手動存儲在cookie中&#xff0…

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、廣州和深圳的新建商品住宅成交量分別環比增加 21%、66%、48% 和 38%&#xff0c;均創年內新高 第二、2024 年世界人工智能大會上&#xff0c;上海向四家企業發放了首批無駕駛人智能網聯汽車示范應用許可&#xff0c;這些企業可以在浦東部…

Redis源碼整體結構

一 前言 Redis源碼研究為什么先介紹整體結構呢?其實也很簡單,作為程序員的,要想對一個項目有快速的認知,對項目整體目錄結構有一個清晰認識,有助于我們更好的了解這個系統。 二 目錄結構 Redis源碼download到本地之后,對應結構如下: 從上面的截圖可以看出,Redis源碼一…

52-5 內網代理2 - LCX端口轉發(不推薦使用LCX)

環境搭建: 本地開3臺虛擬機:kali(必須)、windows2012與2008 (可換成其他windows虛擬機) kali - 網絡配置成橋接模式 windows2012 - 設置兩個網卡,NAT與橋接模式 注意:windows2012要關閉防火墻,要不然其他主機ping不通 關閉防火墻后再開啟遠程桌面連接 windwos20…

去O化神器 Exbase

隨著去O化進程推動&#xff0c;很多舊業務依賴的oracle數據庫&#xff0c;都需要實現做數據庫的替換&#xff0c;當下能很好兼容Oracle&#xff0c;并實現異構數據庫之間轉換的工具并不多。這里給大家推薦一個商業工具數據庫遷移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天學習打卡營|day18

DCGAN生成漫畫頭像 在下面的教程中&#xff0c;我們將通過示例代碼說明DCGAN網絡如何設置網絡、優化器、如何計算損失函數以及如何初始化模型權重。在本教程中&#xff0c;使用的動漫頭像數據集共有70,171張動漫頭像圖片&#xff0c;圖片大小均為96*96。 GAN基礎原理 這部分原…

想知道你的電腦能不能和如何升級RAM嗎?這里有你想要的一些提示

考慮給你的電腦增加更多的RAM,但不確定從哪里開始?本指南涵蓋了有關升級Windows PC或筆記本電腦中RAM的所有信息。 你需要升級RAM嗎 在深入研究升級RAM的過程之前,評估是否需要升級是至關重要的。你是否經歷過系統滯后、頻繁的BSOD錯誤或應用程序和程序突然崩潰?這些癥狀…

從零開始的python學習生活

pycharm部分好用快捷鍵 變量名的定義 與之前學習過的語言有所不同的是&#xff0c;python中變量名的定義更加的簡潔 such as 整形。浮點型和字符串的定義 money50 haha13.14 gaga"hello"字符串的定義依然是需要加上引號&#xff0c;也不需要寫&#xff1b;了 字符…

Django 常見的操作符

在filter() 方法&#xff0c;exclude() 方法中使用大于&#xff0c;小于&#xff0c;模糊匹配等操作符。 常見的操作符如下&#xff1a; 操作符含義示例等于Book.objects.filter(price10)! 或 __ne不等于用于查找字段不等于特定值的記錄。但更常用exclude()方法。__gt大于用于…

React Redux使用@reduxjs/toolkit的hooks

關于redux的學習過程需要幾個官網&#xff0c;有redux官網&#xff0c;React Redux官網和Redux Toolkit的官網。 其中后者的中文沒有找到&#xff0c;不過其中的使用在React Redux官網的快速入門中有介紹。 現在一般不使用connect借接口了。 對于借助Redux Toolkit的React Redu…

Linux GUN(gcc/g++) 版本升級教程

Linux gcc/g 升級命令: // 查看當前安裝的版本 ll /usr/bin/gcc* ll /usr/bin/g*// 更新源 sudo apt update // 安裝新版本 sudo apt install g-10 gcc-10 // 應用新的版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-altern…

【網站推薦】Developer Roadmaps 開發者學習路線

你是否想學習某門技術而苦苦找不到學習路線。本文推薦一個網站&#xff0c;解決學習路徑問題。 roadmap.sh 旨在創建路線圖、指南和其他教育內容&#xff0c;以幫助指導開發人員選擇路徑并指導他們的學習。 技術路線包括了前端后端安卓iosUI設計等內容&#xff0c;一些技術比如…

信息安全三要素

文章目錄 安全三要素 CIA機密性完整性可用性參考資料 安全三要素 CIA 安全三要素&#xff0c;也被稱為信息安全的CIA三要素&#xff0c;是確保信息和系統安全的核心原則。它們分別是&#xff1a; 機密性&#xff08;Confidentiality&#xff09;&#xff1a;保護數據不能泄露…

antdesignvue對話框用戶可移動并縮放

原貼 輕松搞定Ant Design Modal對話框拖拽縮放 - ByteZoneX社區https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模態對話框&#xff1a;實現拖拽縮放功能 **子 Ant Design 是一個流行的前端 UI 框架&#xff0c;提供了一系列實用的組件&#xff0c;包括模態對…

ESP32CAM物聯網教學02

ESP32CAM物聯網教學02 物聯網門鎖 小智來到姑姑家門口&#xff0c;按了門鈴&#xff1b;還在公司上班的姑姑用電腦給小智開了門&#xff0c;讓他先進屋休息。小智對物聯網門鎖產生了興趣&#xff1a;什么是物聯網&#xff1f;為什么這么厲害&#xff1f; 初識物聯網 我們在百…

andboxie-Plus - 知名沙盒軟件、支持游戲多開測試軟件

我們經常會需要用到一些毒瘤軟件——它們可能不是真正的惡意軟件&#xff0c;但總愛偷摸干一些流氓行為。 工作中&#xff0c;有時還不得不安裝使用一些來路不明、不能完全信任的可疑軟件。 裝上吧&#xff0c;心里膈應、難受&#xff1b;不裝吧&#xff0c;有些工作又進行不…

代碼隨想錄算法訓練營第五十八天|KMC101 孤島的總面積、KMC102 沉沒孤島、KMC103 水流問題

題1&#xff1a; 指路&#xff1a;101. 孤島的總面積 (kamacoder.com) 思路與代碼&#xff1a; 本題要求找到不靠邊的陸地面積&#xff0c;那么我們從地圖的最外層開始遍歷&#xff0c;找到靠近四個邊的陸地&#xff0c;通過搜索將周邊靠陸地且相鄰的陸地1變成海洋0&#xf…