内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

用Node編寫(xiě)RESTfulAPI接口的示例代碼

前言

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括淮安網(wǎng)站建設(shè)、淮安網(wǎng)站制作、淮安網(wǎng)頁(yè)制作以及淮安網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,淮安網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到淮安省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

本文介紹了如何用Node開(kāi)發(fā)web程序,并通過(guò)一個(gè)todo list練習(xí)來(lái)介紹如何創(chuàng)建符合RESTful風(fēng)格的API接口。

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

用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)。

用Node編寫(xiě)RESTful API接口的示例代碼

搭建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 = '<h2>Hello Node</h2>'
 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 = '<p>頁(yè)面丟失了</p>'
 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)的方法:

  1. GET:請(qǐng)求獲取指定資源。
  2. HEAD:請(qǐng)求指定資源的響應(yīng)頭。
  3. POST:向指定資源提交數(shù)據(jù)。
  4. PUT:請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源。
  5. DELETE:請(qǐng)求服務(wù)器刪除指定資源。
  6. TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
  7. CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
  8. OPTIONS:返回服務(wù)器支持的HTTP請(qǐng)求方法。

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

  1. GET:獲取
  2. POST:新增
  3. PUT:更新
  4. DELETE:刪除

POST和GET請(qǐng)求

接下來(lái),通過(guò)一個(gè)todo list練習(xí)來(lái)編寫(xiě)RESTful風(fēng)格的GET和POST接口。

需求分析

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

用Node編寫(xiě)RESTful API接口的示例代碼

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

前端部分

前端采用vue.js作為框架,ajax請(qǐng)求采用axios庫(kù)。代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>

 <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>

<body>

<div id="app">
 <h2>Todo List</h2>
 <ul>
  <li v-for="(item, index) in items" :key="index">{{ item }}</li>
 </ul>

 <input type="text" v-model="item">
 <button @click="postApi">button</button>
</div>

<script>
 new Vue({
  el: '#app',
  data: {
   items: [],
   item: ''
  },
  created () {
   axios.get('http://localhost:3000/')
    .then(response => {
     this.items = response.data
    })
    .catch(function (error) {
     console.log(error)
    })
  },
  methods: {
   postApi () {
    axios.post('http://localhost:3000/', {
     item: this.item
    })
     .then(response => {
      this.items = response.data
     })
     .catch(function (error) {
      console.log(error)
     })
   }
  }
 })
</script>
</body>
</html>

后端部分

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...')

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

名稱欄目:用Node編寫(xiě)RESTfulAPI接口的示例代碼
轉(zhuǎn)載來(lái)源:http://www.rwnh.cn/article24/pgcsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、企業(yè)建站、商城網(wǎng)站、品牌網(wǎng)站制作、定制網(wǎng)站網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
治多县| 杭州市| 册亨县| 张家港市| 西贡区| 黄石市| 海原县| 乐昌市| 惠东县| 托里县| 墨玉县| 奉新县| 库车县| 塘沽区| 株洲县| 永和县| 如东县| 永川市| 庆阳市| 永年县| 遂宁市| 广丰县| 泗水县| 翁源县| 武宣县| 井冈山市| 南安市| 仁寿县| 疏勒县| 柳州市| 安吉县| 连州市| 门头沟区| 历史| 阿城市| 武冈市| 合作市| 隆化县| 普宁市| 正安县| 疏附县|