摘要:服務(wù)器每收到一條請求,都會用新的和對象觸發(fā)回調(diào)函數(shù)。但不會在回調(diào)函數(shù)被觸發(fā)之前開始對請求體的解析。在調(diào)用完請求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用方法結(jié)束響應(yīng)了見下圖。比較常見的情況是當(dāng)所請求的資源不存在時返回一個狀態(tài)碼。
前言
本文將通過一個todo list前后端分離的小項目來講解如何用Node創(chuàng)建符合RESTful風(fēng)格的API接口。
創(chuàng)建HTTP服務(wù)器我們先來了解下如何用Node創(chuàng)建HTTP服務(wù)器(熟悉的讀者可以直接跳過)。
用Node創(chuàng)建HTTP服務(wù)器是非常方便的,創(chuàng)建HTTP服務(wù)器要調(diào)用http.createServer()函數(shù),它只有一個參數(shù),是個回調(diào)函數(shù),服務(wù)器每次收到HTTP請求后都會調(diào)用這個回調(diào)函數(shù)。這個回調(diào)會收到兩個參數(shù),請求和響應(yīng)對象,通常簡寫為req和res:
var http = require("http") var server = http.createServer(function(req, res){ res.end("Hello World") }) server.listen(3000, "127.0.0.1")
運行上面的代碼,在瀏覽器中訪問http://localhost:3000。然后你應(yīng)該能看到一個包含“Hello World.”的普通文本頁面。
服務(wù)器每收到一條HTTP請求,都會用新的req和res對象觸發(fā)回調(diào)函數(shù)。
在觸發(fā)回調(diào)函數(shù)之前,Node會解析請求的HTTP頭,并將它們作為req對象的一部分提供給請求回調(diào)。但Node不會在回調(diào)函數(shù)被觸發(fā)之前開始對請求體的解析。這種做法跟某些服務(wù)端框架不同,比如PHP就是在程序邏輯運行前就把請求頭和請求體都解析出來了。
Node不會自動往客戶端寫任何響應(yīng)。在調(diào)用完請求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用res.end()方法結(jié)束響應(yīng)了(見下圖)。這樣在結(jié)束響應(yīng)之前,你可以在請求的生命期內(nèi)運行任何你想運行的異步邏輯。如果你沒能結(jié)束響應(yīng),請求會掛起,直到客戶端超時,或者它會一直處于打開狀態(tài)。
搭建HTTP服務(wù)器僅僅是個開始。接下來我們來看看如何設(shè)定響應(yīng)狀態(tài)碼和響應(yīng)頭中的字段,如何正確處理異常。
設(shè)置響應(yīng)頭可以用res.setHeader(field, value)來設(shè)置相應(yīng)的響應(yīng)頭,下面是代碼:
var http = require("http") var server = http.createServer(function(req, res){ var body = "設(shè)置狀態(tài)碼Hello Node
" res.setHeader("Content-Length", body.length) res.setHeader("Content-Type", "text/html") res.end(body) }) server.listen(3000)
我們經(jīng)常需要返回默認(rèn)狀態(tài)碼200之外的HTTP狀態(tài)碼。比較常見的情況是當(dāng)所請求的資源不存在時返回一個404 Not Found狀態(tài)碼。
這可以通過設(shè)定res.statusCode屬性來實現(xiàn)。在程序響應(yīng)期間可以隨時給這個屬性賦值,但必須在第一次調(diào)用res.write()或res.end()之前。
var http = require("http") var server = http.createServer(function(req, res) { var body = "頁面丟失了
" res.setHeader("Content-Type", "text/html;charset=utf-8") res.statusCode = 404 res.end(body) }) server.listen(3000, "127.0.0.1")
Node的策略是提供小而強的網(wǎng)絡(luò)API,不同于Rails或Django之類的框架。像會話這種高級概念以及HTTP cookies這樣的基礎(chǔ)組件都沒有包括在Node的內(nèi)核之中。那些都要由第三方模塊提供。
構(gòu)建 RESTful Web 服務(wù)Roy Fielding博士在2000年提出了表征狀態(tài)轉(zhuǎn)移 (REST)。它是一種基于 HTTP 協(xié)議的網(wǎng)絡(luò)應(yīng)用的接口風(fēng)格。
依照規(guī)定,比如GET、POST、PUT和DELETE,分別與資源的獲取、創(chuàng)建、更新和刪除相對應(yīng)。
HTTP 協(xié)議定義了以下8種標(biāo)準(zhǔn)的方法:
GET:請求獲取指定資源。
HEAD:請求指定資源的響應(yīng)頭。
POST:向指定資源提交數(shù)據(jù)。
PUT:請求服務(wù)器存儲一個資源。
DELETE:請求服務(wù)器刪除指定資源。
TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷。
CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS:返回服務(wù)器支持的HTTP請求方法。
創(chuàng)建標(biāo)準(zhǔn)的REST服務(wù)需要實現(xiàn)四個HTTP謂詞。每個謂詞會覆蓋一個操作:
GET:獲取
POST:新增
PUT:更新
DELETE:刪除
POST和GET請求接下來,我們開始編寫符合RESTful風(fēng)格的GET和POST接口。
需求分析項目決定采用前后端分離,交互數(shù)據(jù)格式約定為json,前端添加的數(shù)據(jù)提交到服務(wù)器后,由服務(wù)器存入服務(wù)器內(nèi)存中。前端界面如下:
首先,我們先編寫前端部分。
前端部分前端部分采用當(dāng)今流行的vue.js作為框架,ajax請求采用axios庫。代碼如下:
后端部分Title Todo List
- {{ item }}
后端部分將用req.method獲取請求的HTTP謂詞,并分情況對其進(jìn)行處理。代碼如下:
var http = require("http") var items = [] http.createServer(function(req, res) { // 設(shè)置cors跨域 res.setHeader("Access-Control-Allow-Origin", "*") res.setHeader("Access-Control-Allow-Headers", "Content-Type") res.setHeader("Content-Type", "application/json") switch (req.method) { // 設(shè)置了cors跨域 // post請求時,瀏覽器會先發(fā)一次options請求,如果請求通過,則繼續(xù)發(fā)送正式的post請求 case "OPTIONS": res.statusCode = 200 res.end() break case "GET": let data = JSON.stringify(items) res.write(data) res.end() break case "POST": let item = "" req.on("data", function (chunk) { item += chunk }) req.on("end", function () { // 存入 item = JSON.parse(item) items.push(item.item) // 返回到客戶端 let data = JSON.stringify(items) res.write(data) res.end() }) break } }).listen(3000) console.log("http server is start...")小結(jié)
當(dāng)然,一個完整的RESTful服務(wù)還應(yīng)該實現(xiàn)PUT謂詞和DELETE謂詞,如果你真的讀懂了本文,那么相信這對你已經(jīng)不再是問題了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95921.html
摘要:服務(wù)器每收到一條請求,都會用新的和對象觸發(fā)回調(diào)函數(shù)。但不會在回調(diào)函數(shù)被觸發(fā)之前開始對請求體的解析。在調(diào)用完請求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用方法結(jié)束響應(yīng)了見下圖。比較常見的情況是當(dāng)所請求的資源不存在時返回一個狀態(tài)碼。 前言 本文將通過一個todo list前后端分離的小項目來講解如何用Node創(chuàng)建符合RESTful風(fēng)格的API接口。 創(chuàng)建HTTP服務(wù)器 我們先來了解下如何用Node創(chuàng)建H...
摘要:今天項目已經(jīng)能夠做一個簡單的后端服務(wù)了,在中新建一個表,就能自動提供的服務(wù)了。函數(shù)用來區(qū)分是查詢還是執(zhí)行操作。字段組合值組合,由元組轉(zhuǎn)換為數(shù)組配置相應(yīng)的占位符修改接口以字典形式提供參數(shù),占位符的形式為,只支持按主鍵進(jìn)行修改。 今天項目已經(jīng)能夠做一個簡單的后端服務(wù)了,在mysql中新建一個表,就能自動提供restful api的CURD服務(wù)了。 關(guān)鍵點 根據(jù)REST的四種動詞形式,動態(tài)...
摘要:基于構(gòu)建的服務(wù)器腳手架這是一個基于的輕量級腳手架,支持支持使用編寫。腳手架可以根據(jù)不同的環(huán)境配置不同的信息運行價值,支持開發(fā),測試,生產(chǎn)環(huán)境的不同參數(shù)配置。 #基于webpack構(gòu)建的 Koa2 restful API 服務(wù)器腳手架 這是一個基于 Koa2 的輕量級 RESTful API Server 腳手架,支持 ES6, 支持使用TypeScript編寫。 GIT地址:https...
1. Aest 項目地址:https://github.com/wangduandu... 功能強大的REST接口測試工具, Power By Jest, axios, superstruct, mustache, lodash showImg(http://p3alsaatj.bkt.clouddn.com/20180810131752_zpRRP5_Jietu20180810-130750....
閱讀 3097·2023-04-25 16:50
閱讀 911·2021-11-25 09:43
閱讀 3523·2021-09-26 10:11
閱讀 2524·2019-08-26 13:28
閱讀 2535·2019-08-26 13:23
閱讀 2428·2019-08-26 11:53
閱讀 3571·2019-08-23 18:19
閱讀 2993·2019-08-23 16:27