Restful
REST表述性狀態傳遞
REST一般基於使用HTTP,URL,XML,HTML。
REST使用的數據格式爲JSONjava
GET 獲取數據
PUT 用於更新和添加數據
DELETE 用於刪除數據
POST 添加數據git
一種基於http的架構方式github
REStful全稱爲表述性狀態轉移。任何事物只要有被引用的必要都爲資源。資源能夠爲實體,能夠爲抽象的概念。web
用戶的手機號
用戶的我的信息
用戶手機潛在的價值
資源要被識別,要有惟一的標識。
URL能夠當作資源的地址,能夠當作資源的名稱。
以github舉例
倉庫地址 https://github.com/mySoul8012...
我的信息地址 https://github.com/mySoul8012
看URL可知倉庫是在那個用戶名下的express
使用-或者_來進行資源的分割
使用/來表示資源的層級關係
使用?將資源進行過濾 /pulls?state=closed 表示已經關閉的推送請求,URL對應的是一種特定的查詢結果。
.或者:表示同級的資源關係編程
指一次或者屢次請求一個資源的時候,應該具備相同的反作用。屬於語義化的一個詞
HTTP協議是一種面向資源的應用層協議
GET用於獲取資源,不該該有反作用,因此稱爲其冪等性,例如請求一個資源的時候,不會改變其狀態,此時說明GET具備冪等性
HTTP的DELETE,會刪除資源,此時具備反作用,可是屢次的反作用是相同的,仍是具備其冪等性
POST爲建立一個資源,每次反作用都是不一樣的,即沒有冪等性
PUT爲更新資源,對於同一個URL一次和屢次的是相同的,此時具備冪等性json
安全且冪等,表示一種獲取的表示,會有緩存api
不安全且不冪等,使用服務器端的管理的實例號生成資源,建立子資源,用於部分更新資源,若是沒有修改則不會更新資源(一種樂觀鎖的表示)瀏覽器
PUT不安全且冪等。用客戶端管理的實例,建立一個資源,經過替換的方式更新資源緩存
不安全可是冪等
四種tcp方式,都是不安全,由於都是明文傳輸,須要使用https,完成加密,防止被抓包
官方網站 https://rubyonrails.org/
或者名爲 Ruby on Rails
一種基於Ruby語言即面向對象,命令式,函數式,動態的通用編程語言,由日本科學家發明。特色是函數式編程
這是一個開源的web應用框架,嚴格按照MVC架構開發。
Github
推特
basecamp
Groupon
yellowpages
爲博客增長一個Java分類,生成的路徑名爲/categories/java 採用PUT方法,完成更新,由於此時是由客戶端決定的
rails 框架是經過隱藏參數的方法,達到傳遞真實請求的方式
客戶端獲取的只是資源的表述。即資源的外在表現。
資源的表述包括數據和描述數據的元數據。
經過HTTP內容的協商,客戶端經過頭部信息達到
以github爲例,JSON表述以下
URL裏帶上版本號
URL後綴區分表述格式
超連接即狀態引擎。
在表述格式里加入鏈接引導客戶端。即這種連接稱爲流通性
以github爲例
狀態應該區分應用狀態和資源狀態。
客戶端維護應用狀態。
服務端維護資源狀態。
客戶端和服務端交互必須是無狀態的。
Cookie是保存一些服務器不依賴於會話狀態便可依賴的信息。
會話狀態不是做爲資源狀態保存在服務器端的,而是被客戶端做爲應用狀態進行跟蹤的。客戶端的應用在服務器端指引的超連接指引下發生變遷。
爲一種架構模式
建立一個JSON數據資源文件
{ "user1": { "name": "mahesh", "password": "password", "profession": "teacher", "id": 1 }, "user2": { "name": "suresh", "password": "password2", "profession": "libraian", "id": 2 }, "user3": { "name": "ramesh", "password": "password3", "profession": "clerk", "id": 3 }, }
即根據JSON文件有如下api
序號 | Url | Http方法 | 發送內容 | 結果 |
---|---|---|---|---|
1 | listUsers | GET | 空 | 顯示全部用戶列表 |
2 | addUser | POST | JSON字符串 | 添加新用戶 |
3 | deleteUsers | DELETE | JSON字符串 | 刪除用戶 |
4 | id | GET | 空 | 顯示用戶詳細信息 |
http://127.0.0.1:1937/listUsers
/*server.js*/ var express = require('express'); // 引入express框架 var app = express(); var fs = require('fs'); // 引入文件模塊 // 建立get請求 app.get('/listUsers', (req, res) => { fs.readFile(__dirname + '/' + 'users.json', 'utf8', (err, data) => { // 讀取文件 console.log( data ); res.end(data); // 將讀取到的內容返回給客戶端 }); }); // 啓動server var server = app.listen(1937, () => { console.log(server.address()); })
查看一下JSON數據
這樣暫時完成了一部分
JSON.parse有個小坑,最後不容許使用,做爲結尾
/*server.js*/ var express = require('express'); // 引入express框架 var app = express(); var fs = require('fs'); // 引入文件模塊 // 添加用戶的數據 var user = { "user4": { "name":"mohit", "password":"password4", "profession":"teacher", "id":4 } } // 建立get請求 app.get('/addUser', (req, res) => { // 讀取已存在的數據 fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => { if (err) { return console.log(err); }; data = JSON.parse(data); // 將傳入的JSON轉換爲對象格式 data["user4"] = user["user4"]; console.log(data); res.end( JSON.stringify(data) ); // 將對象轉換成爲JSON格式 }); }); // 啓動server var server = app.listen(1937, () => { console.log(server.address()); })
{ "user1": { "name": "mahesh", "password": "password", "profession": "teacher", "id": 1 }, "user2": { "name": "suresh", "password": "password2", "profession": "libraian", "id": 2 }, "user3": { "name": "ramesh", "password": "password3", "profession": "clerk", "id": 3 } }
訪問 http://127.0.0.1:1937/addUser
返回的JSON數據
此時本地的JSON數據仍舊未發生改變,若是要其發生改變須要fs的寫模塊,將JSON數據寫入JSON文件中
/*server.js*/ var express = require('express'); // 引入express框架 var app = express(); var fs = require('fs'); // 引入文件模塊 // 添加用戶的數據 var user = { "user4": { "name":"mohit", "password":"password4", "profession":"teacher", "id":4 } } // 建立獲取用戶列表路由 app.get('/listUsers', function (req, res) { fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { console.log( data ); res.end( data ); }); }) // 建立添加用戶路由請求 app.get('/addUser', (req, res) => { // 讀取已存在的數據 fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => { if (err) { return console.log(err); }; data = JSON.parse(data); // 將傳入的JSON轉換爲對象格式 data["user4"] = user["user4"]; console.log(data); res.end( JSON.stringify(data) ); // 將對象轉換成爲JSON格式 }); }); // 添加顯示用戶詳情路由 app.get('/:id', (req, res) => { // 首先讀取已存在的用戶 fs.readFile( __dirname + '/' + "users.json", 'utf8', (err, data) => { data = JSON.parse( data ); var user = data["user" + req.params.id] // 獲取get獲得的值 console.log( user ); res.end( JSON.stringify(user) ); }) }) // 啓動server var server = app.listen(1937, () => { console.log(server.address()); })
查看瀏覽器獲得的JSON數據
/*server.js*/ var express = require('express'); // 引入express框架 var app = express(); var fs = require('fs'); // 引入文件模塊 // 建立獲取用戶列表路由 app.get('/listUsers', (req, res) => { fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => { console.log( data ); res.end( data ); }); }) // 建立添加用戶路由請求 app.get('/addUser', (req, res) => { // 讀取已存在的數據 fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => { if (err) { return console.log(err); }; // 添加用戶 var user = { "user4": { "name":"mohit", "password":"password4", "profession":"teacher", "id":4 } } data = JSON.parse(data); // 將傳入的JSON轉換爲對象格式 data["user4"] = user["user4"]; console.log(data); res.end( JSON.stringify(data) ); // 將對象轉換成爲JSON格式 }); }); // 添加顯示用戶詳情路由 app.get('/:id', (req, res) => { // 首先讀取已存在的用戶 fs.readFile( __dirname + '/' + "users.json", 'utf8', (err, data) => { data = JSON.parse( data ); var user = data["user" + req.params.id] // 獲取get獲得的值 console.log( user ); res.end( JSON.stringify(user) ); }) }) var app = express(); // 不清楚爲何這裏要從新定義? // 刪除用戶 app.get('/deleteUser', (req, res) => { // 首先獲取用戶信息 fs.readFile( __dirname + "/" + "users.json", 'utf8', (err, data) => { data = JSON.parse( data ); delete data["user" + 2]; console.log( data ); res.end( JSON.stringify(data)); }); }) // 啓動server var server = app.listen(1937, () => { console.log(server.address()); })
不清楚爲何要從新定義一個類。