成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Node編寫(xiě)RESTful API接口

Meils / 2223人閱讀

摘要:服務(wù)器每收到一條請(qǐng)求,都會(huì)用新的和對(duì)象觸發(fā)回調(diào)函數(shù)。但不會(huì)在回調(diào)函數(shù)被觸發(fā)之前開(kāi)始對(duì)請(qǐng)求體的解析。在調(diào)用完請(qǐng)求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用方法結(jié)束響應(yīng)了見(jiàn)下圖。比較常見(jiàn)的情況是當(dāng)所請(qǐng)求的資源不存在時(shí)返回一個(gè)狀態(tài)碼。

前言

本文將通過(guò)一個(gè)todo list前后端分離的小項(xiàng)目來(lái)講解如何用Node創(chuàng)建符合RESTful風(fēng)格的API接口。

創(chuàng)建HTTP服務(wù)器

我們先來(lái)了解下如何用Node創(chuàng)建HTTP服務(wù)器(熟悉的讀者可以直接跳過(guò))。
用Node創(chuàng)建HTTP服務(wù)器是非常方便的,創(chuàng)建HTTP服務(wù)器要調(diào)用http.createServer()函數(shù),它只有一個(gè)參數(shù),是個(gè)回調(diào)函數(shù),服務(wù)器每次收到HTTP請(qǐng)求后都會(huì)調(diào)用這個(gè)回調(diào)函數(shù)。這個(gè)回調(diào)會(huì)收到兩個(gè)參數(shù),請(qǐng)求和響應(yīng)對(duì)象,通常簡(jiǎn)寫(xiě)為req和res:

var http = require("http")
var server = http.createServer(function(req, res){
   res.end("Hello World")
})
server.listen(3000, "127.0.0.1")

運(yùn)行上面的代碼,在瀏覽器中訪問(wèn)http://localhost:3000。然后你應(yīng)該能看到一個(gè)包含“Hello World.”的普通文本頁(yè)面。

服務(wù)器每收到一條HTTP請(qǐng)求,都會(huì)用新的req和res對(duì)象觸發(fā)回調(diào)函數(shù)。
在觸發(fā)回調(diào)函數(shù)之前,Node會(huì)解析請(qǐng)求的HTTP頭,并將它們作為req對(duì)象的一部分提供給請(qǐng)求回調(diào)。但Node不會(huì)在回調(diào)函數(shù)被觸發(fā)之前開(kāi)始對(duì)請(qǐng)求體的解析。這種做法跟某些服務(wù)端框架不同,比如PHP就是在程序邏輯運(yùn)行前就把請(qǐng)求頭和請(qǐng)求體都解析出來(lái)了。

Node不會(huì)自動(dòng)往客戶端寫(xiě)任何響應(yīng)。在調(diào)用完請(qǐng)求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用res.end()方法結(jié)束響應(yīng)了(見(jiàn)下圖)。這樣在結(jié)束響應(yīng)之前,你可以在請(qǐng)求的生命期內(nèi)運(yùn)行任何你想運(yùn)行的異步邏輯。如果你沒(méi)能結(jié)束響應(yīng),請(qǐng)求會(huì)掛起,直到客戶端超時(shí),或者它會(huì)一直處于打開(kāi)狀態(tài)。

搭建HTTP服務(wù)器僅僅是個(gè)開(kāi)始。接下來(lái)我們來(lái)看看如何設(shè)定響應(yīng)狀態(tài)碼響應(yīng)頭中的字段,如何正確處理異常。

設(shè)置響應(yīng)頭

可以用res.setHeader(field, value)來(lái)設(shè)置相應(yīng)的響應(yīng)頭,下面是代碼:

var http = require("http")
var server = http.createServer(function(req, res){
  var body = "

Hello Node

" res.setHeader("Content-Length", body.length) res.setHeader("Content-Type", "text/html") res.end(body) }) server.listen(3000)
設(shè)置狀態(tài)碼

我們經(jīng)常需要返回默認(rèn)狀態(tài)碼200之外的HTTP狀態(tài)碼。比較常見(jiàn)的情況是當(dāng)所請(qǐng)求的資源不存在時(shí)返回一個(gè)404 Not Found狀態(tài)碼。
這可以通過(guò)設(shè)定res.statusCode屬性來(lái)實(shí)現(xiàn)。在程序響應(yīng)期間可以隨時(shí)給這個(gè)屬性賦值,但必須在第一次調(diào)用res.write()或res.end()之前。

var http = require("http")
var server = http.createServer(function(req, res) {
  var body = "

頁(yè)面丟失了

" res.setHeader("Content-Type", "text/html;charset=utf-8") res.statusCode = 404 res.end(body) }) server.listen(3000, "127.0.0.1")

Node的策略是提供小而強(qiáng)的網(wǎng)絡(luò)API,不同于Rails或Django之類的框架。像會(huì)話這種高級(jí)概念以及HTTP cookies這樣的基礎(chǔ)組件都沒(méi)有包括在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)建、更新和刪除相對(duì)應(yīng)。
HTTP 協(xié)議定義了以下8種標(biāo)準(zhǔn)的方法:

GET:請(qǐng)求獲取指定資源。

HEAD:請(qǐng)求指定資源的響應(yīng)頭。

POST:向指定資源提交數(shù)據(jù)。

PUT:請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源。

DELETE:請(qǐng)求服務(wù)器刪除指定資源。

TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。

CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

OPTIONS:返回服務(wù)器支持的HTTP請(qǐng)求方法。

創(chuàng)建標(biāo)準(zhǔn)的REST服務(wù)需要實(shí)現(xiàn)四個(gè)HTTP謂詞。每個(gè)謂詞會(huì)覆蓋一個(gè)操作:

GET:獲取

POST:新增

PUT:更新

DELETE:刪除

POST和GET請(qǐng)求

接下來(lái),我們開(kāi)始編寫(xiě)符合RESTful風(fēng)格的GET和POST接口。

需求分析

項(xiàng)目決定采用前后端分離,交互數(shù)據(jù)格式約定為json,前端添加的數(shù)據(jù)提交到服務(wù)器后,由服務(wù)器存入服務(wù)器內(nèi)存中。前端界面如下:

首先,我們先編寫(xiě)前端部分。

前端部分

前端部分采用當(dāng)今流行的vue.js作為框架,ajax請(qǐng)求采用axios庫(kù)。代碼如下:




  
  Title

  
  




Todo List

  • {{ item }}
后端部分

后端部分將用req.method獲取請(qǐng)求的HTTP謂詞,并分情況對(duì)其進(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請(qǐng)求時(shí),瀏覽器會(huì)先發(fā)一次options請(qǐng)求,如果請(qǐng)求通過(guò),則繼續(xù)發(fā)送正式的post請(qǐng)求
    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)然,一個(gè)完整的RESTful服務(wù)還應(yīng)該實(shí)現(xiàn)PUT謂詞和DELETE謂詞,如果你真的讀懂了本文,那么相信這對(duì)你已經(jīng)不再是問(wèn)題了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95921.html

相關(guān)文章

  • Node編寫(xiě)RESTful API接口

    摘要:服務(wù)器每收到一條請(qǐng)求,都會(huì)用新的和對(duì)象觸發(fā)回調(diào)函數(shù)。但不會(huì)在回調(diào)函數(shù)被觸發(fā)之前開(kāi)始對(duì)請(qǐng)求體的解析。在調(diào)用完請(qǐng)求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用方法結(jié)束響應(yīng)了見(jiàn)下圖。比較常見(jiàn)的情況是當(dāng)所請(qǐng)求的資源不存在時(shí)返回一個(gè)狀態(tài)碼。 前言 本文將通過(guò)一個(gè)todo list前后端分離的小項(xiàng)目來(lái)講解如何用Node創(chuàng)建符合RESTful風(fēng)格的API接口。 創(chuàng)建HTTP服務(wù)器 我們先來(lái)了解下如何用Node創(chuàng)建H...

    gyl_coder 評(píng)論0 收藏0
  • python寫(xiě)通restful api service(二)

    摘要:今天項(xiàng)目已經(jīng)能夠做一個(gè)簡(jiǎn)單的后端服務(wù)了,在中新建一個(gè)表,就能自動(dòng)提供的服務(wù)了。函數(shù)用來(lái)區(qū)分是查詢還是執(zhí)行操作。字段組合值組合,由元組轉(zhuǎn)換為數(shù)組配置相應(yīng)的占位符修改接口以字典形式提供參數(shù),占位符的形式為,只支持按主鍵進(jìn)行修改。 今天項(xiàng)目已經(jīng)能夠做一個(gè)簡(jiǎn)單的后端服務(wù)了,在mysql中新建一個(gè)表,就能自動(dòng)提供restful api的CURD服務(wù)了。 關(guān)鍵點(diǎn) 根據(jù)REST的四種動(dòng)詞形式,動(dòng)態(tài)...

    liangzai_cool 評(píng)論0 收藏0
  • 最好的koa2+mysql的RESTful API腳手架,mvc架構(gòu),支持node調(diào)試,pm2部署

    摘要:基于構(gòu)建的服務(wù)器腳手架這是一個(gè)基于的輕量級(jí)腳手架,支持支持使用編寫(xiě)。腳手架可以根據(jù)不同的環(huán)境配置不同的信息運(yùn)行價(jià)值,支持開(kāi)發(fā),測(cè)試,生產(chǎn)環(huán)境的不同參數(shù)配置。 #基于webpack構(gòu)建的 Koa2 restful API 服務(wù)器腳手架 這是一個(gè)基于 Koa2 的輕量級(jí) RESTful API Server 腳手架,支持 ES6, 支持使用TypeScript編寫(xiě)。 GIT地址:https...

    xiongzenghui 評(píng)論0 收藏0
  • Aest 功能強(qiáng)大的NodeJS Restful 接口測(cè)試工具

    1. Aest 項(xiàng)目地址:https://github.com/wangduandu... 功能強(qiáng)大的REST接口測(cè)試工具, Power By Jest, axios, superstruct, mustache, lodash showImg(http://p3alsaatj.bkt.clouddn.com/20180810131752_zpRRP5_Jietu20180810-130750....

    sihai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<