對于前端來說,網絡請求主要就是用 ajax 的方式去處理。所以本文也會站在前端角度簡單講解 Node 中如何使用 http 模塊。
前后端對接時,現在常用的請求方法有 GET、POST、PUT、PATCH、DELETE。當然,還有其他方法,但本文主要面向新手,希望能做到快速起步。所以本文只講 GET 和 POST 這兩種最最最常用的方法。
在敲代碼前,你首先需要準備一個 編輯器(我用vs code)、瀏覽器、postman 還有安裝好 Node.js 。
創建服務
Node.js 提供了 http 模塊,可用于網絡請求。
創建一個 js 文件,輸入以下代碼。(本例的文件命名為 index.js)
const http = require('http')
const server = http.createServer((res, req) => {
req.end('hello world')
})
server.listen(8000, () => {
console.log('http://localhost:8000')
})
解釋:
- Node.js 使用 commonjs 語法,所以引入 http 模塊使用了 require 的方法。
- http 模塊有一個 createServer 方法,該方法的參數是一個函數,函數里又有2個參數,res 是前端發送請求帶過來的信息;req 是后端返回信息給前端時的一些方法和屬性的集合。
- 通過 req.end 方法,可以返回一段字符串給前端。
- 通過 listen 方法可以設置需要監聽的端口號,第二個參數是一個函數,我在控制臺里輸出 http://localhost:8000 是方便啟動服務后方便自己打開這個地址。
使用 Node.js 運行上面的代碼:
node index.js
運行完上面的命令,控制臺應該會輸出 http://localhost:8000 ,此時打開瀏覽器,輸入 http://localhost:8000 后頁面上會出現 “hello world”,證明服務創建成功,并且可以訪問了。
GET
其實上一步所用的也是 GET 方法來訪問后端,但上一步并沒有解析參數。
get 請求的參數通常是掛在 url 后面的,比如 http://localhost:8000?msg=hello
如果有參數,會用 ? 開始,然后使用 參數名=值 的寫法。
如果有多個參數,會使用 & 將參數區分開來:
http://localhost:8000?key1=value1&key2=value2&key3=value3
在 Node.js 里,如果需要解析 url 的參數,可以使用 node:querystring 模塊。
const http = require('http') // 引入 htpp 模塊
const querystring = require('node:querystring') // 引入 node:querystring 模塊解析url
const server = http.createServer((req, res) => {
console.log('method: ', req.method) // 打印請求方法,GET
const url = req.url
console.log('url: ', url) // 打印被訪問的url
req.query = querystring.parse(url.split('?')[1]) // 通過 ? 問號 分隔參數,并使用 querystring.parse 解析問號后面的參數
console.log('query: ', req.query) // 輸出參數
res.end(JSON.stringify(req.query)) // 將參數返回給前端
})
server.listen(8000, () => {
console.log('http://localhost:8000')
})
執行上面的代碼,并在瀏覽器訪問 http://localhost:8000/?msg=123&name=leihou
在瀏覽器會顯示出如下內容
解析:
- req.url 可以獲取到當前訪問后端的 url 路徑
- url.split('?')[1] 使用字符串的方法根據 ? 進行切割,然后獲取后面那段
- 使用 querystring.parse 方法將參數轉換成對象的形式
- res.end 將參數返回給前端。
- 前端在瀏覽器地址欄輸入 http://localhost:8000/?msg=123&name=leihou 時,后端會把參數返回,前端在頁面中渲染出返回的參數。
POST
POST 請求會被 GET 更安全,同時也更麻煩。不能直接在瀏覽器地址欄輸入 url 請求。
你可以寫一段前端代碼,通過 ajax 的方式請求。但本文主要講解 Node.js ,所以我還是建議你使用 postman 發起 POST 請求。因為 postman 無需你處理跨域等問題。
const http = require('http')
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
// 數據格式
console.log('content-type', req.headers['content-type'])
// 接收數據
let postData = ''
req.on('data', chunk => {
postData += chunk.toString()
})
req.on('end', () => {
console.log(postData)
res.end('hello world') // 在這里返回,因為是異步
})
}
})
server.listen(8000 () => {
console.log('http://localhost:8000')
})
和 GET 不同,POST 接收數據需要用 req.on('data') 進行接收,用 req.on('end') 處理接收數據完成的操作。
在 Node.js 里除了接收數據外,其他用法和 GET 有點像。
最后在 postman 訪問 http://localhost:8000 ,并在 Body 的 raw 里填寫 JSON 數據
按下 Send 鍵后,控制臺會輸出 postman 發送過來的數據。
綜合實例
如果理解了 GET 和 POST 請求的話,我們就可以嘗試將這兩個請求結合起來使用了。
const http = require('http')
const querystring = require('node:querystring')
const server = http.createServer((req, res) => {
const method = req.method
const url = req.url
const path = url.split('?')[0]
const query = querystring.parse(url.split('?')[1])
// 設置返回格式 JSON
res.setHeader('Content-type', 'Application/json') // 這里返回JSON。如果是 text/html 返回html
// 返回的數據
const resData = {
method,
url,
path,
query,
}
// 返回
if (method === 'GET') {
res.end(
JSON.stringify(resData)
)
}
if (method === 'POST') {
let postData = ''
req.on('data', chunk => {
postData += chunk.toString()
})
req.on('end', () => {
resData.postData = JSON.parse(postData)
// 返回
res.end(
JSON.stringify(resData)
)
})
}
})
server.listen(8000, () => {
console.log('http://localhost:8000')
})
上面的代碼最主要是判斷 method 是 GET 還是 POST ,因為兩者接收數據的方式是不一樣的。
你可以運行上面的代碼,嘗試在瀏覽器和 postman 各發送一下 GET 和 POST 測試一下。