首頁  >  文章  >  web前端  >  用Node編寫RESTful API接口

用Node編寫RESTful API接口

不言
不言原創
2018-07-07 18:00:093639瀏覽

這篇文章主要介紹了關於用Node編寫RESTful API接口,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

前言

本文將透過一個todo list前後端分離的小專案來講解如何用Node建立符合RESTful風格的API介面。

建立HTTP伺服器

我們先來了解下如何用Node建立HTTP伺服器(熟悉的讀者可以直接跳過)。
用Node建立HTTP伺服器是非常方便的,建立HTTP伺服器要呼叫http.createServer()函數,它只有一個參數,是個回調函數,伺服器每次收到HTTP請求後都會調用這個回調函數。這個回呼會收到兩個參數,請求和回應對象,通常簡寫為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。然後你應該可以看到一個包含「Hello World.」的普通文字頁面。

伺服器每收到一個HTTP請求,都會用新的req和res物件觸發回呼函數。
在觸發回呼函數之前,Node會解析請求的HTTP頭,並將它們作為req物件的一部分提供給請求回呼。但Node不會在回呼函數被觸發之前開始對請求體的解析。這種做法跟某些服務端框架不同,例如PHP就是在程式邏輯運作前就把請求頭和請求體都解析出來了。

Node不會自動往客戶端寫任何回應。在調用完請求回呼函數之後,就要由你負責用res.end()方法結束回應了(見下圖)。這樣在結束回應之前,你可以在請求的生命期內運行任何你想運行的非同步邏輯。如果你沒能結束回應,請求會掛起,直到客戶端逾時,或者它會一直處於開啟狀態。
用Node編寫RESTful API接口

搭建HTTP伺服器只是個開始。接下來我們來看看如何設定回應狀態碼回應頭中的字段,如何正確處理異常

設定回應頭

可以用res.setHeader(field, 值)來設定對應的回應頭,以下是程式碼:

var http = require('http')
var server = http.createServer(function(req, res){
  var body = '<h1>Hello Node</h1>'
  res.setHeader('Content-Length', body.length)
  res.setHeader('Content-Type', 'text/html')
  res.end(body)
})
server.listen(3000)

設定狀態碼

我們常常需要傳回預設狀態碼200以外的HTTP狀態碼。比較常見的情況是當所要求的資源不存在時傳回一個404 Not Found狀態碼。
這可以透過設定res.statusCode屬性來實現。在程式回應期間可以隨時給這個屬性賦值,但必須在第一次呼叫res.write()或res.end()之前。

var http = require('http')
var server = http.createServer(function(req, res) {
  var body = '<p>页面丢失了</p>'
  res.setHeader('Content-Type', 'text/html;charset=utf-8')
  res.statusCode = 404
  res.end(body)
})
server.listen(3000, '127.0.0.1')

Node的策略是提供小而強的網路API,不同於Rails或Django之類的框架。像會話這種進階概念以及HTTP cookies這樣的基礎元件都沒有包括在Node的核心之中。那些都要由第三方模組提供。

建構 RESTful Web 服務

Roy Fielding博士在2000年提出了表徵狀態轉移(REST)。它是一種基於 HTTP 協定的網路應用的介面風格
依照規定,例如GET、POST、PUT和DELETE,分別與資源的取得、建立、更新和刪除相對應。
HTTP  協定定義了以下8種標準的方法:

  1. GET:請求取得指定資源。

  2. HEAD:請求指定資源的回應頭。

  3. POST:向指定資源提交資料。

  4. PUT:請求伺服器儲存一個資源。

  5. DELETE:請求伺服器刪除指定資源。

  6. TRACE:回顯伺服器收到的請求,主要用於測試或診斷。

  7. CONNECT:HTTP/1.1 協定中預留給能夠將連線改為管道方式的代理伺服器。

  8. OPTIONS:傳回伺服器支援的HTTP請求方法。

建立標準的REST服務需要實作四個HTTP謂詞。每個謂詞會覆寫一個運算:

  1. GET:取得

  2. #POST:新增

  3. PUT:更新

  4. DELETE:刪除

#POST和GET請求

接下來,我們開始寫符合RESTful風格的GET和POST介面。

需求分析

專案決定採用前後端分離,互動資料格式約定為json,前端新增的資料提交到伺服器後,由伺服器存入伺服器記憶體中。前端介面如下:
用Node編寫RESTful API接口

首先,我們先寫前端部分。

前端部分

前端部分採用當今流行的vue.js作為框架,ajax請求採用axios函式庫。程式碼如下:

nbsp;html>


  <meta>
  <title>Title</title>

  <script></script>
  <script></script>




<p>
  </p><h1>Todo List</h1>
  
        
  • {{ item }}
  •   
      <script> new Vue({ el: &#39;#app&#39;, data: { items: [], item: &#39;&#39; }, created () { axios.get(&#39;http://localhost:3000/&#39;) .then(response => { this.items = response.data }) .catch(function (error) { console.log(error) }) }, methods: { postApi () { axios.post(&#39;http://localhost:3000/&#39;, { item: this.item }) .then(response => { this.items = response.data }) .catch(function (error) { console.log(error) }) } } }) </script>

後端部分

後端部分將以req.method取得請求的HTTP謂詞,並分情況處理。程式碼如下:

var http = require('http')

var items = []

http.createServer(function(req, res) {
  // 设置cors跨域
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
  res.setHeader('Content-Type', 'application/json')

  switch (req.method) {
    // 设置了cors跨域
    // post请求时,浏览器会先发一次options请求,如果请求通过,则继续发送正式的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...')

小结

当然,一个完整的RESTful服务还应该实现PUT谓词和DELETE谓词,如果你真的读懂了本文,那么相信这对你已经不再是问题了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

async/await 并行请求和错误处理

node爬取拉勾网数据并导出为excel文件

以上是用Node編寫RESTful API接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn