Node.js中的HTTP?Server對象與GET、POST請求
上一博客學習了請求與響應,2次讀2次寫,但有一個問題就是客戶端寫入的時候怎么知道請求到達。所以HTTP Server對象出現(xiàn)了。它提供了實現(xiàn)HTTP服務器的基本框架。它可以監(jiān)聽端口的底層套接字和接收請求,然后發(fā)送響應給客戶端連接的處理程序。
它提供了一下幾個事件:
- request:當服務器收到客戶端請求時觸發(fā)。例如:function callback(request,response){}.
- connection:當一個新的TCP流建立時觸發(fā)。例如:function callback (socket)
- close:服務器關閉時觸發(fā),回調(diào)不接收參數(shù)。
- checkContinue:當收到包括期待的100-continue標頭的請求時觸發(fā)。即使不處理此事件,默認的事件處理程序也響應。例如:function callback(request,response){}
- connect:接收到HTTP CONNECT請求時發(fā)出。callback接收request、response、head。例如:function callback(request,response,head)
- upgrade:當客戶端請求HTTP升級時發(fā)出。function callback (request,response,head)
- clientError:當客戶端連接套接字發(fā)出一個錯誤時發(fā)出。function callback(error,socket){}
要啟動HTTP服務器,首先使用createServer([requestListener])方法創(chuàng)建對象然后通過listen(port,[hostname],[backlog],[callback]).
- port:端口
- hostname:主機名
- backlog(積壓):指定被允許進行排隊的最大待處理連接數(shù)。默認511.
- callback(回調(diào)):指定該服務器已經(jīng)開始在指定的端口監(jiān)聽時,要執(zhí)行的回調(diào)處理程序。
對于文件系統(tǒng)的連接可以用下面的兩種方法:
- listen(path,[callback]):文件路徑
- listen(handle,[callback]):接收一個已經(jīng)打開的文件描述符句柄。
如果要停止監(jiān)聽可以使用close([callback])方法。
上面了解了下HTTP Server對象,下面用GET、POST實驗一下。
GET:
var http = require('http'); var messages = [ 'Hello World', 'From a basic Node.js server', 'Take Luck']; http.createServer(function (req, res) { res.setHeader("Content-Type", "text/html"); res.writeHead(200); res.write('<html><head><title>Simple HTTP Server</title></head>'); res.write('<body>'); for (var idx in messages){ res.write('\n<h1>' + messages[idx] + '</h1>'); } res.end('\n</body></html>'); }).listen(8080); var options = { hostname: 'localhost', port: '8080', }; function handleResponse(response) { var serverData = ''; response.on('data', function (chunk) { serverData += chunk; }); response.on('end', function () { console.log("Response Status:", response.statusCode); console.log("Response Headers:", response.headers); console.log(serverData); }); } http.request(options, function(response){ handleResponse(response); }).end();
輸出結果:
Response Status: 200 Response Headers: { 'content-type': 'text/html', date: 'Mon, 28 Mar 2016 12:51:06 GMT', connection: 'close', 'transfer-encoding': 'chunked' } <html><head><title>Simple HTTP Server</title></head><body> <h1>Hello World</h1> <h1>From a basic Node.js server</h1> <h1>Take Luck</h1> </body></html>
POST:
var http = require('http'); http.createServer(function (req, res) { var jsonData = ""; req.on('data', function (chunk) { jsonData += chunk; }); req.on('end', function () { var reqObj = JSON.parse(jsonData); var resObj = { message: "Hello " + reqObj.name, question: "Are you a good " + reqObj.occupation + "?" }; res.writeHead(200); res.end(JSON.stringify(resObj)); }); }).listen(8088); var http = require('http'); var options = { host: '127.0.0.1', path: '/', port: '8088', method: 'POST' }; function readJSONResponse(response) { var responseData = ''; response.on('data', function (chunk) { responseData += chunk; }); response.on('end', function () { var dataObj = JSON.parse(responseData); console.log("Raw Response: " +responseData); console.log("Message: " + dataObj.message); console.log("Question: " + dataObj.question); }); } var req = http.request(options, readJSONResponse); req.write('{"name":"Bilbo", "occupation":"Burglar"}'); req.end();
輸出結果:
Raw Response: {"message":"Hello Bilbo","question":"Are you a good Burglar?"}
Message: Hello Bilbo
Question: Are you a good Burglar?
第一次使用的時候用的端口號是8080,然后就報下面的錯誤.換一下端口號就OK了。
events.js:141 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::8080 at Object.exports._errnoException (util.js:870:11) at exports._exceptionWithHostPort (util.js:893:20) at Server._listen2 (net.js:1236:14) at listen (net.js:1272:10) at Server.listen (net.js:1368:5) at Object.<anonymous> (c:\Users\Administrator\Desktop\nodejs-mongodb-angularjs-web-development-master\ch07\http_server_post.js:16:4) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12)
以上基本把HTTP這塊基本學了一下,對于HTTPS的話可以用HTTPS的客戶端和服務端,和HTTP的差別不大,就是多了幾個選項.
對于更底層的socket、tcp、udp這些就先跳過,這些做web可能也不會用到,大致學一遍之后再回過頭來復習學習一下。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
koa2 數(shù)據(jù)api中間件設計模型的實現(xiàn)方法
這篇文章主要介紹了koa2 數(shù)據(jù)api中間件設計模型的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07手把手教你更優(yōu)雅的修改node_modules里的代碼
這篇文章主要給大家介紹了關于如何更優(yōu)雅的修改node_modules里的代碼的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-02-02package.json與package-lock.json創(chuàng)建及使用詳解
這篇文章主要為大家介紹了package.json與package-lock.json創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07