日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

用Go實(shí)現(xiàn)一個(gè)帶緩存的REST API服務(wù)端

來源: 責(zé)編: 時(shí)間:2024-01-02 17:27:58 232觀看
導(dǎo)讀1.REST API原理REST(Representational State Transfer)是一種通過HTTP協(xié)議設(shè)計(jì)API的架構(gòu)風(fēng)格,用于構(gòu)建分布式系統(tǒng)中的網(wǎng)絡(luò)應(yīng)用程序。REST API(RESTful API)是基于這種設(shè)計(jì)風(fēng)格的應(yīng)用程序編程接口。其主要優(yōu)點(diǎn)是其極大的靈

1.REST API原理

REST(Representational State Transfer)是一種通過HTTP協(xié)議設(shè)計(jì)API的架構(gòu)風(fēng)格,用于構(gòu)建分布式系統(tǒng)中的網(wǎng)絡(luò)應(yīng)用程序。REST API(RESTful API)是基于這種設(shè)計(jì)風(fēng)格的應(yīng)用程序編程接口。其主要優(yōu)點(diǎn)是其極大的靈活性, 只要需要直接從服務(wù)器向Web應(yīng)用程序或站點(diǎn)的用戶提供數(shù)據(jù), 開發(fā)人員直接使用REST API即可實(shí)現(xiàn)。zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

REST API 的設(shè)計(jì)目的是創(chuàng)建簡(jiǎn)單、可伸縮、可維護(hù)且具有良好可讀性的接口, 以促進(jìn)客戶端和服務(wù)器之間的有效通信, 通過使用HTTP協(xié)議和一組統(tǒng)一的設(shè)計(jì)原則, REST API在實(shí)現(xiàn)上具備一些特定的屬性:zRA28資訊網(wǎng)——每日最新資訊28at.com

  • 資源(Resources):在REST中, 數(shù)據(jù)或服務(wù)都被視為資源。每個(gè)資源都有一個(gè)唯一的標(biāo)識(shí)符, 用于在網(wǎng)絡(luò)上標(biāo)識(shí)和定位該資源。
  • 表現(xiàn)層(Representation):資源的狀態(tài)可以以不同的表現(xiàn)形式呈現(xiàn), 例如: JSON、XML或HTML。客戶端可以通過請(qǐng)求特定的表現(xiàn)形式來與服務(wù)器交互。
  • 狀態(tài)無關(guān)(Stateless):REST是狀態(tài)無關(guān)的, 這意味著每個(gè)請(qǐng)求從客戶端到服務(wù)器都包含了足夠的信息, 服務(wù)器不需要存儲(chǔ)客戶端的狀態(tài)。每個(gè)請(qǐng)求都應(yīng)該包含了執(zhí)行該請(qǐng)求所需的所有信息。
  • 統(tǒng)一接口(Uniform Interface):RESTful API的設(shè)計(jì)應(yīng)該遵循一致的接口原則, 使得不同的組件之間的通信變得簡(jiǎn)單統(tǒng)一。
  • 無狀態(tài)通信(Stateless Communication):每個(gè)請(qǐng)求從客戶端到服務(wù)器都應(yīng)該包含足夠的信息, 以便服務(wù)器能夠理解和處理請(qǐng)求,而無需依賴之前的請(qǐng)求。
  • 緩存(Cacheability):REST API支持緩存, 以提高性能和減輕服務(wù)器的負(fù)擔(dān)。服務(wù)器可以在響應(yīng)中指定數(shù)據(jù)的緩存策略,而客戶端可以使用緩存來避免重復(fù)請(qǐng)求相同的數(shù)據(jù)。
  • 使用標(biāo)準(zhǔn)方法(Standard Methods):REST使用標(biāo)準(zhǔn)的HTTP方法,如:GET、POST、PUT、DELETE來執(zhí)行不同的操作, 這些方法對(duì)應(yīng)于對(duì)資源的不同操作, 使得API的使用更加直觀和符合HTTP標(biāo)準(zhǔn)。

2.REST API服務(wù)端設(shè)計(jì)

下面我將使用Go語(yǔ)言來設(shè)計(jì)一個(gè)REST API的服務(wù)端, 這里的模擬場(chǎng)景是通過服務(wù)端來對(duì)外提供文章的增、刪、查服務(wù), 文章的查詢方式包括兩種: 1.查詢服務(wù)器所有文章內(nèi)容。2.根據(jù)文章ID查詢某篇文章的內(nèi)容。zRA28資訊網(wǎng)——每日最新資訊28at.com

文章的屬性包括三個(gè)字段: 文章ID、文章標(biāo)題、文章內(nèi)容, 這里可以用一個(gè)結(jié)構(gòu)體表示:zRA28資訊網(wǎng)——每日最新資訊28at.com

type Article struct {  ID string `json:"id,omitempty"`  Title string `json:"title,omitempty"`  Content string `json:"content,omitempty"`}

由于我們?cè)O(shè)計(jì)了四個(gè)功能接口, 將其轉(zhuǎn)換成接口代碼框架如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

// 獲取所有文章接口func GetArticles(w http.ResponseWriter, r *http.Request) {     ...}// 獲取單篇文章接口func GetArticle(w http.ResponseWriter, r *http.Request) {     ...}// 創(chuàng)建文章接口func CreateArticle(w http.ResponseWriter, r *http.Request) {     ...}// 刪除文章接口func DeleteArticle(w http.ResponseWriter, r *http.Request) {     ...}

3.功能代碼實(shí)現(xiàn)

zRA28資訊網(wǎng)——每日最新資訊28at.com

首先來實(shí)現(xiàn)獲取所有文章的接口, 具體參考代碼如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

// 獲取所有文章func GetArticles(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  // 嘗試從緩存中獲取文章列表  if cachedArticles, found := articleCache.Load("all"); found {    json.NewEncoder(w).Encode(cachedArticles)    return  }  // 從原始數(shù)據(jù)源獲取文章列表  json.NewEncoder(w).Encode(Articles)  // 將文章列表存入緩存  articleCache.Store("all", Articles)}

獲取所有文章首先是嘗試從緩存中獲取文章列表, 緩存cachedArticles這里實(shí)際是一個(gè)sync.Map類型的變量, 支持并發(fā)安全, 如果找到的話, 直接序列化成JSON的格式返回。如果緩存中沒有找到, 則從原始數(shù)據(jù)源中獲取文章列表(實(shí)際應(yīng)用中應(yīng)該是從數(shù)據(jù)庫(kù)中獲取)并序列化成JSON返回。并把該文章列表存入緩存之中。zRA28資訊網(wǎng)——每日最新資訊28at.com

接下來實(shí)現(xiàn)第二個(gè)接口,通過文章ID來查詢, 實(shí)現(xiàn)參考代碼如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

// 獲取單篇文章func GetArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 嘗試從緩存中獲取單個(gè)文章  if cachedArticle, found := articleCache.Load(params["id"]); found {    json.NewEncoder(w).Encode(cachedArticle)    return  }  // 從原始數(shù)據(jù)源獲取單個(gè)文章  for _, article := range Articles {    if article.ID == params["id"] {      json.NewEncoder(w).Encode(article)      // 將單個(gè)文章存入緩存      articleCache.Store(params["id"], article)      return    }  }  json.NewEncoder(w).Encode(&Article{})}

首先將傳入的ID參數(shù)在緩存中進(jìn)行查找, 找到則直接返回JSON數(shù)據(jù)。如果沒有找到則繼續(xù)在文章列表中查找, 并將單篇文章存入緩存。zRA28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建文章接口參考代碼如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

// 創(chuàng)建文章func CreateArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  var article Article  _ = json.NewDecoder(r.Body).Decode(&article)  Articles = append(Articles, article)  // 清除所有文章緩存  articleCache.Delete("all")  json.NewEncoder(w).Encode(Articles)}

創(chuàng)建文章列表需要注意的是, 這里為了維護(hù)緩存一致性,避免臟數(shù)據(jù), 對(duì)緩存進(jìn)行了清空, 以便下次GetArticles()時(shí)更新最新的緩存。zRA28資訊網(wǎng)——每日最新資訊28at.com

同理也不難實(shí)現(xiàn)刪除文章的接口:zRA28資訊網(wǎng)——每日最新資訊28at.com

// 刪除文章func DeleteArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 清除單個(gè)文章緩存  articleCache.Delete(params["id"])  for index, article := range Articles {    if article.ID == params["id"] {      Articles = append(Articles[:index], Articles[index+1:]...)      break    }  }  // 清除所有文章緩存  articleCache.Delete("all")  json.NewEncoder(w).Encode(Articles)}

最后, 在main函數(shù)中, 我們需要往列表中添加一些數(shù)據(jù)來模擬服務(wù)端保存的文章數(shù), 并且定義四個(gè)接口的路由, 整體代碼如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (  "encoding/json"  "log"  "net/http"  "sync"  "github.com/gorilla/mux")// Article 結(jié)構(gòu)體表示 API 中的數(shù)據(jù)模型type Article struct {  ID string `json:"id,omitempty"`  Title string `json:"title,omitempty"`  Content string `json:"content,omitempty"`}// Articles 數(shù)組用于存儲(chǔ)文章數(shù)據(jù)var Articles []Articlevar articleCache sync.Map// 獲取所有文章func GetArticles(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  // 嘗試從緩存中獲取文章列表  if cachedArticles, found := articleCache.Load("all"); found {    json.NewEncoder(w).Encode(cachedArticles)    return  }  // 從原始數(shù)據(jù)源獲取文章列表  json.NewEncoder(w).Encode(Articles)  // 將文章列表存入緩存  articleCache.Store("all", Articles)}// 獲取單個(gè)文章func GetArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 嘗試從緩存中獲取單個(gè)文章  if cachedArticle, found := articleCache.Load(params["id"]); found {    json.NewEncoder(w).Encode(cachedArticle)    return  }  // 從原始數(shù)據(jù)源獲取單個(gè)文章  for _, article := range Articles {    if article.ID == params["id"] {      json.NewEncoder(w).Encode(article)      // 將單個(gè)文章存入緩存      articleCache.Store(params["id"], article)      return    }  }  json.NewEncoder(w).Encode(&Article{})}// 創(chuàng)建文章func CreateArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  var article Article  _ = json.NewDecoder(r.Body).Decode(&article)  Articles = append(Articles, article)  // 清除所有文章緩存  articleCache.Delete("all")  json.NewEncoder(w).Encode(Articles)}// 刪除文章func DeleteArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 清除單個(gè)文章緩存  articleCache.Delete(params["id"])  for index, article := range Articles {    if article.ID == params["id"] {      Articles = append(Articles[:index], Articles[index+1:]...)      break    }  }  // 清除所有文章緩存  articleCache.Delete("all")  json.NewEncoder(w).Encode(Articles)}func main() {  // 初始化數(shù)據(jù)  Articles = append(Articles, Article{ID: "1", Title: "Article 1", Content: "Content 1"})  Articles = append(Articles, Article{ID: "2", Title: "Article 2", Content: "Content 2"})  // 創(chuàng)建路由器  router := mux.NewRouter()  // 定義路由處理程序  router.HandleFunc("/articles", GetArticles).Methods(http.MethodGet)  router.HandleFunc("/articles/{id}", GetArticle).Methods(http.MethodGet)  router.HandleFunc("/articles", CreateArticle).Methods(http.MethodPost)  router.HandleFunc("/articles/{id}", DeleteArticle).Methods(http.MethodDelete)  // 啟動(dòng)服務(wù)器  log.Fatal(http.ListenAndServe(":8080", router))}

4.實(shí)際運(yùn)行效果

zRA28資訊網(wǎng)——每日最新資訊28at.com

在本地運(yùn)行服務(wù)端, 服務(wù)端將在本地監(jiān)聽8080端口, 通過瀏覽器輸入: http://127.0.0.1:8080/articles, 該接口將獲取所有文章,如圖:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

通過API接口通過文章ID查詢某一篇文章,接口請(qǐng)求如下:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

新增一條新文章是POST請(qǐng)求, 這里主要通過Apifox發(fā)送POST請(qǐng)求,如圖:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

從返回的結(jié)果來看, 成功添加了一條新記錄, 再次使用獲取全部文章接口看一下,如圖:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

新記錄確實(shí)添加成功。zRA28資訊網(wǎng)——每日最新資訊28at.com

最后, 還是通過Apifox,我們發(fā)送一個(gè)刪除ID為2的文章請(qǐng)求,如圖:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

從Apifox返回的結(jié)果來看,確實(shí)刪除成功了,  現(xiàn)在再獲取一下全部文章,如圖:zRA28資訊網(wǎng)——每日最新資訊28at.com

zRA28資訊網(wǎng)——每日最新資訊28at.com

所有接口全部驗(yàn)證成功。zRA28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-56402-0.html用Go實(shí)現(xiàn)一個(gè)帶緩存的REST API服務(wù)端

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 六種不同類型的K8s部署策略總結(jié)

下一篇: 聊一聊 C# 的線程本地存儲(chǔ)TLS到底是什么

標(biāo)簽:
  • 熱門焦點(diǎn)
  • vivo TWS Air開箱體驗(yàn):真輕 臻好聽

    在vivo S15系列新機(jī)的發(fā)布會(huì)上,vivo的最新款真無線藍(lán)牙耳機(jī)vivo TWS Air也一同發(fā)布,本次就這款耳機(jī)新品給大家?guī)硪粋€(gè)簡(jiǎn)單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產(chǎn)
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個(gè)數(shù)字。例如,一個(gè)擁有三個(gè)或更多子項(xiàng)的grid。你可能會(huì)想,為什么需要這樣做呢?在某些情況下,一個(gè)組件或一個(gè)布局可能會(huì)
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 拼多多APP上線本地生活入口,群雄逐鹿萬(wàn)億市場(chǎng)

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了“本地生活”入口,位置較深,位于首頁(yè)的“充值中心”內(nèi),目前主要售賣美食相關(guān)的
  • 中國(guó)家電海外掘金正當(dāng)時(shí)|出海專題

    作者|吳南南編輯|胡展嘉運(yùn)營(yíng)|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場(chǎng)戰(zhàn)況空前,中國(guó)創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國(guó)的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 當(dāng)家的盒馬,加速謀生

    來源 | 價(jià)值星球Planet作者 | 歸去來自己“當(dāng)家”的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計(jì)劃今年開放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 機(jī)構(gòu)稱Q2國(guó)內(nèi)智能手機(jī)銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場(chǎng)調(diào)查機(jī)構(gòu)Counterpoint Research公布的最新報(bào)告,2023年第2季度中國(guó)智能手機(jī)銷量同比下降4%,創(chuàng)新自2014年以來第2季度銷量新低。報(bào)
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
  • iQOO Neo8系列新品發(fā)布會(huì)

    旗艦雙芯 更強(qiáng)更Pro
Top 主站蜘蛛池模板: 垫江县| 手机| 内乡县| 同德县| 弥渡县| 宁武县| 濉溪县| 瑞昌市| 花莲县| 千阳县| 武鸣县| 丹东市| 泰安市| 辛集市| 宁海县| 海口市| 兴隆县| 洛南县| 福鼎市| 香格里拉县| 申扎县| 金堂县| 喜德县| 高雄县| 平定县| 铁岭县| 永德县| 合作市| 天镇县| 达孜县| 德庆县| 柳江县| 淄博市| 普宁市| 太谷县| 都江堰市| 石渠县| 渑池县| 石楼县| 八宿县| 历史|