使用nodejs搭建一個簡易HTTP服務的實現(xiàn)示例
本文只使用nodejs的http模塊搭建一個簡單的http服務。
主要實現(xiàn)功能:
- 響應客戶端的請求。
- 處理不同的請求地址并返回信息。
- 獲取客戶端傳遞的請求體參數(shù)(json字符串)和查詢字符串參數(shù)。
- 服務端設置cookie和讀取客戶端發(fā)送的cookie。
先搭建一個簡單的HTTP服務
主要使用http模塊的createServer方法和listen方法。
代碼如下:
const http = require('http'); // 初始化http服務 const server = http.createServer(); // 啟動 HTTP 服務監(jiān)聽連接 server.listen(8000, () => { console.log('service run: http://127.0.0.1:8000'); }); // 偵聽請求事件 server.on('request', (req, res) => { try { // 設置響應頭允許跨域 res.setHeader('Access-Control-Allow-Origin', '*'); res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('HTTP服務搭建成功'); } catch (ex) { console.error(ex.message); res.statusCode = 500; res.end('service error'); } });
如上代碼所示一個簡單的http服務就搭好了,但是現(xiàn)在還只能返回一些簡單的信息到客戶端,而且也沒有根據(jù)請求地址和請求參數(shù)做不同的處理。 那么接下來我們就先來處理請求地址的問題。
根據(jù)不同的請求地址返回不同的信息
每當收到新的請求時,request事件會被調(diào)用,傳給request事件的回調(diào)函數(shù)可以接受兩個對象:一個request對象,提供了請求的詳細信息。一個response對象,用于設置返回給客戶端的信息。 我們可以從request對象的url屬性中獲取請求地址,代碼如下:
const http = require('http'); const server = http.createServer(); server.listen(8000, () => { console.log('service run: http://127.0.0.1:8000'); }); server.on('request', (req, res) => { try { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Content-Type', 'application/json'); // 獲取請求地址 const urls = req.url.split('?'); const requestAddress = urls[0]; console.log(`請求地址:${ requestAddress }`); const callback = { '/test': () => { res.statusCode = 200; res.end(JSON.stringify({text: '通過測試'})); }, '/': () => { res.statusCode = 200; res.end(JSON.stringify({text: 'hello world'})); } } if (callback[requestAddress] instanceof Function) { return callback[requestAddress]() } res.writeHead(200, '響應成功'); res.end('成功收到請求'); } catch (ex) { console.error(ex.message); res.statusCode = 500; res.end('service error'); } });
如上代碼實現(xiàn)了不同請求地址返回不同信息的功能,但是也還存在一些問題。例如:沒有實現(xiàn)獲取請求體參數(shù)和查詢字符串。
那么我們接下來就來添加獲取請求參數(shù)的代碼。
獲取請求參數(shù)
查詢字符串可以從request對象的url屬性中獲取,請求體參數(shù)可以通過偵聽request對象的data事件獲取。如下所示:
const http = require('http'); const server = http.createServer(); server.listen(8000, () => { console.log('service run: http://127.0.0.1:8000'); }); server.on('request', (req, res) => { try { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Content-Type', 'application/json'); const urls = req.url.split('?'); const requestAddress = urls[0]; console.log(`請求地址:${ requestAddress }`); const callback = { '/test': () => { console.log(`查詢字符串:${urls[1]}`); if (req.method === 'POST') { // post請求,獲取json格式的請求體參數(shù) let data = ''; // req對象是一個流(參考Stream API),可以監(jiān)聽它的data事件來獲取數(shù)據(jù)塊。 req.on('data', (chunk) => { // 這里假設收到的數(shù)據(jù)是字符串,隱式轉(zhuǎn)換:二進制數(shù)據(jù) => 字符串 data += chunk; }); // 在獲取數(shù)據(jù)結(jié)束時,調(diào)用end事件 req.on('end', () => { data = JSON.parse(data); console.log('請求體:', data); }); } res.statusCode = 200; res.end(JSON.stringify({text: '通過測試'})); }, '/': () => { console.log(`查詢字符串:${urls[1]}`); res.statusCode = 200; res.end(JSON.stringify({text: 'hello world'})); } } if (callback[requestAddress] instanceof Function) { return callback[requestAddress]() } res.writeHead(200, '響應成功'); res.end('成功收到請求'); } catch (ex) { console.error(ex.message); res.statusCode = 500; res.end('service error'); } });
通過以上代碼我們就實現(xiàn)了獲取請求體里的json格式數(shù)據(jù)和查詢字符串數(shù)據(jù)參數(shù)。
實現(xiàn)服務端設置(跨域)cookie和讀取客戶端發(fā)送的cookie
服務器要允許跨域帶憑據(jù)的請求,需要設置響應頭Access-Control-Allow-Credentials為true,且響應頭Access-Control-Allow-Origin的值不能為‘*’,必須為一個具體的域名。
前端要允許跨域發(fā)送憑據(jù)到服務器,則需要設置XMLHttpRequest對象的withCredentials屬性,將其值修改為true即可。
const http = require('http'); const server = http.createServer(); server.listen(8000, () => { console.log('service run: http://127.0.0.1:8000'); }); server.on('request', (req, res) => { try { // 跨域允許攜帶憑據(jù)(cookie之類) res.setHeader('Access-Control-Allow-Credentials', 'true'); // 要允許跨域攜帶cookie,必須設置為具體的域,不能是‘*' res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500'); res.setHeader('Content-Type', 'application/json'); const requestAddress = req.url.split('?')[0]; const callback = { '/login': () => { // 設置cookie res.setHeader('Set-Cookie', 'name=wst;age=24;Max-Age=666;'); res.statusCode = 200; // 返回json格式數(shù)據(jù)到客戶端 res.end(JSON.stringify({text: '登錄成功'})); }, '/': () => { // 通過req.headers.cookie讀取cookie console.log(req.headers.cookie) res.statusCode = 200; res.end(JSON.stringify({text: 'hello world'})); } } if (callback[requestAddress] instanceof Function) { return callback[requestAddress]() } res.writeHead(200, '響應成功'); res.end('成功收到請求'); } catch (ex) { console.error(ex.message); res.statusCode = 500; res.end('service error'); } });
到此,我們已經(jīng)實現(xiàn)了一個簡單的HTTP服務,更多相關(guān)nodejs搭建HTTP服務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
connect中間件session、cookie的使用方法分享
今天大象哥用了下connect的session和cookie,感覺還挺好用的,分享一下(里面坑挺多的,文檔寫的太模糊了,費了哥不少時間)。2014-06-06Node.js的MongoDB驅(qū)動Mongoose基本使用教程
這篇文章主要介紹了Node.js的MongoDB驅(qū)動Mongoose的基本使用教程,前端js+后端Node.js+數(shù)據(jù)庫MongoDB是當下流行的JavaScript全棧開發(fā)方案,需要的朋友可以參考下2016-03-03NestJS開發(fā)核心概念Providers類基本用法詳解
這篇文章主要為大家介紹了NestJS開發(fā)核心概念Providers類基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08node.js中fs.stat與fs.fstat的區(qū)別詳解
fs.stat和fs.fstat他們都是用來獲取文件的狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于node.js中fs.stat與fs.fstat區(qū)別的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-06-06Node.js 利用cheerio制作簡單的網(wǎng)頁爬蟲示例
本篇文章主要介紹了Node.js 利用cheerio制作簡單的網(wǎng)頁爬蟲示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03