日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

架构之:REST和RESTful

發(fā)布時(shí)間:2024/2/28 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 架构之:REST和RESTful 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡(jiǎn)介
  • REST
  • REST和RESTful API
  • REST架構(gòu)的基本原則
    • Uniform interface統(tǒng)一的接口
    • Client–server 客戶端和服務(wù)器端獨(dú)立
    • Stateless無(wú)狀態(tài)
    • Cacheable可緩存
    • Layered system分層系統(tǒng)
    • Code on demand按需編碼
    • RESTful API的例子
  • 總結(jié)

簡(jiǎn)介

近幾年微服務(wù)是如火如荼的在發(fā)展,而微服務(wù)之間的調(diào)用和漸漸的從RPC調(diào)用轉(zhuǎn)移到了HTTP調(diào)用。于是經(jīng)常聽(tīng)到有些同事說(shuō)我們提供微服務(wù)并且暴露RESTful接口給別的系統(tǒng),但是什么是RESTful接口呢?它和REST有什么關(guān)系呢?
別急,本文將會(huì)帶你一探究竟。

REST

REST是一種架構(gòu)。

首先我們要記住的是REST是一種架構(gòu)方式,并不是一種協(xié)議。它只是告訴我們應(yīng)該如何去搭建一個(gè)可靠的系統(tǒng)。

REST的全稱是REpresentational State Transfer。中文可能不好翻譯,我們暫將其定義為有代表性的狀態(tài)轉(zhuǎn)義。它是分布式系統(tǒng)的一種架構(gòu)方式。最先是由Roy Fielding在2000年他的博士畢業(yè)論文中首先提到的。

REST架構(gòu)在現(xiàn)在的web應(yīng)用中非常常見(jiàn),它并不涉及到具體的編碼,它只是一種高級(jí)比的指導(dǎo)方案,具體的實(shí)現(xiàn)還是由你自己決定。

REST和RESTful API

我們剛剛講解了REST,那么REST和RESTful API有什么關(guān)系呢?

我們知道,API是服務(wù)和服務(wù)之間,客戶端和服務(wù)端之間溝通的橋梁,通過(guò)API之間的調(diào)用,我們可以從服務(wù)器中獲取到需要的資源信息。而RESTful API就是符合REST架構(gòu)的API。

所以不是所有的HTTP協(xié)議的API都是RESTful API,它的前提是你的系統(tǒng)是REST架構(gòu)的。

REST架構(gòu)的基本原則

那么什么樣的系統(tǒng)才能被稱為是REST架構(gòu)的系統(tǒng)呢?根據(jù)Roy Fielding的論文描述,REST架構(gòu)的系統(tǒng)有6個(gè)基本特征。我們一一來(lái)說(shuō)明。

Uniform interface統(tǒng)一的接口

在REST架構(gòu)中,最為核心的元素就是資源。我們將資源定義為一個(gè)個(gè)的獨(dú)立的URI。一個(gè)資源用一個(gè)獨(dú)立并且唯一的URI來(lái)表示。

單個(gè)的資源不能太大也不能太小,它表示的是一個(gè)獨(dú)立的可以操作的單位。這些資源通過(guò)通用的獲取方式來(lái)進(jìn)行獲取和操作。比如對(duì)資源的CURD可以分別用不同的HTTP method來(lái)表示(PUT,POST,GET,DELETE)。

同時(shí)需要對(duì)資源進(jìn)行統(tǒng)一的命名,定義統(tǒng)一的link格式和數(shù)據(jù)格式。

還有一點(diǎn),根據(jù)HATEOAS協(xié)議,一個(gè)資源還應(yīng)該包含指向該資源或者相關(guān)資源的URI。可以能有些同學(xué)現(xiàn)在對(duì)這一點(diǎn)還有些疑惑,不過(guò)沒(méi)關(guān)系,后面我們會(huì)詳細(xì)對(duì)HATEOAS進(jìn)行講解。

Spring也提供了對(duì)HATEOAS的支持,我們看一個(gè)基本的HATEOAS的請(qǐng)求:

GET http://localhost:8080/greeting

該請(qǐng)求的返回可以是這樣的:

{"content":"Hello, World!","_links":{"self":{"href":"http://localhost:8080/greeting?name=World"}} }

大家可以看到上面返回了一個(gè)代表自己URI的資源鏈接。

Client–server 客戶端和服務(wù)器端獨(dú)立

另外的一條規(guī)則就是客戶端和服務(wù)器端獨(dú)立,客戶端和服務(wù)器端互不影響,他們之間的唯一交互就是API的調(diào)用。

對(duì)于客戶端來(lái)說(shuō)只要能夠通過(guò)API獲取到對(duì)應(yīng)的資源即可,并不關(guān)心服務(wù)器是怎么實(shí)現(xiàn)的。

而對(duì)于服務(wù)器端來(lái)說(shuō),只需要提供保持不變的API即可,自己內(nèi)部的實(shí)現(xiàn)可以自由決定,也不需要考慮客戶端是如何使用這些API的。

這條規(guī)則對(duì)于現(xiàn)在的很多前后端分離的架構(gòu)來(lái)說(shuō)已經(jīng)使用了。

Stateless無(wú)狀態(tài)

和HTTP協(xié)議一樣,REST架構(gòu)中各個(gè)服務(wù)之間的API調(diào)用也是無(wú)狀態(tài)的。無(wú)狀態(tài)的意思是服務(wù)器并不保存API調(diào)用的歷史記錄,也不存儲(chǔ)任何關(guān)于客戶端的信息。對(duì)于服務(wù)器來(lái)說(shuō),每個(gè)請(qǐng)求都是最新的。

所以用戶的狀態(tài)信息是在客戶端進(jìn)行保存和維護(hù)的,客戶端需要在每個(gè)接口帶上可以識(shí)別用戶的唯一標(biāo)記,從而在服務(wù)器端進(jìn)行認(rèn)證和識(shí)別,從而獲取到對(duì)應(yīng)的資源。

Cacheable可緩存

緩存是提升系統(tǒng)速度的利器,對(duì)于REST的資源也是一樣的,在REST中對(duì)于可緩存的資源需要標(biāo)明它是可以被緩存的。

從而對(duì)應(yīng)的調(diào)用方可以將這些資源進(jìn)行緩存,從而提升系統(tǒng)的效率。

Layered system分層系統(tǒng)

現(xiàn)代的系統(tǒng)基本上都是分層的,在REST架構(gòu)中也是一樣,只要保證對(duì)外提供的資源URI是一致的,架構(gòu)并不關(guān)心你到底使用的是幾層架構(gòu)。

Code on demand按需編碼

一般來(lái)說(shuō),REST架構(gòu)中各個(gè)服務(wù)通常是通過(guò)JSON或者XML來(lái)進(jìn)行交互的。但是這并不是硬性規(guī)定??梢苑祷乜蓤?zhí)行的代碼直接運(yùn)行。

RESTful API的例子

我們來(lái)舉幾個(gè)常見(jiàn)的RESTful API的例子,來(lái)見(jiàn)識(shí)一下這種架構(gòu)的神奇之處:

請(qǐng)求一個(gè)entity:

GET https://services.odata.org/TripPinRESTierService/People

根據(jù)ID請(qǐng)求一個(gè)entity:

GET https://services.odata.org/TripPinRESTierService/People('russellwhyte')

請(qǐng)求一個(gè)entity的某個(gè)屬性:

GET https://services.odata.org/TripPinRESTierService/Airports('KSFO')/Name

使用filter進(jìn)行查詢:

GET https://services.odata.org/TripPinRESTierService/People?$filter=FirstName eq 'Scott'

修改數(shù)據(jù):

POST https://services.odata.org/TripPinRESTierService/People header: {Content-Type: application/json } body: {"UserName":"lewisblack","FirstName":"Lewis","LastName":"Black","Emails":["lewisblack@example.com"],"AddressInfo": [{"Address": "187 Suffolk Ln.","City": {"Name": "Boise","CountryRegion": "United States","Region": "ID"}}] }

刪除數(shù)據(jù):

DELETE https://services.odata.org/TripPinRESTierService/People('russellwhyte')

更新數(shù)據(jù):

PATCH https://services.odata.org/TripPinRESTierService/People('russellwhyte') header: {Content-Type: application/json } body: {"FirstName": "Mirs","LastName": "King" }

總結(jié)

本文講解了REST和RESTful相關(guān)的概念,那么對(duì)于其中最重要的資源如何定義呢?敬請(qǐng)期待后續(xù)文章。

本文已收錄于 http://www.flydean.com/01-rest-restful/

最通俗的解讀,最深刻的干貨,最簡(jiǎn)潔的教程,眾多你不知道的小技巧等你來(lái)發(fā)現(xiàn)!

總結(jié)

以上是生活随笔為你收集整理的架构之:REST和RESTful的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。