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

當前位置:首頁 > 科技  > 軟件

用Go實現一個帶緩存的REST API服務端

來源: 責編: 時間:2024-01-02 17:27:58 255觀看
導讀1.REST API原理REST(Representational State Transfer)是一種通過HTTP協議設計API的架構風格,用于構建分布式系統中的網絡應用程序。REST API(RESTful API)是基于這種設計風格的應用程序編程接口。其主要優點是其極大的靈

1.REST API原理

REST(Representational State Transfer)是一種通過HTTP協議設計API的架構風格,用于構建分布式系統中的網絡應用程序。REST API(RESTful API)是基于這種設計風格的應用程序編程接口。其主要優點是其極大的靈活性, 只要需要直接從服務器向Web應用程序或站點的用戶提供數據, 開發人員直接使用REST API即可實現。5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

REST API 的設計目的是創建簡單、可伸縮、可維護且具有良好可讀性的接口, 以促進客戶端和服務器之間的有效通信, 通過使用HTTP協議和一組統一的設計原則, REST API在實現上具備一些特定的屬性:5Yq28資訊網——每日最新資訊28at.com

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

2.REST API服務端設計

下面我將使用Go語言來設計一個REST API的服務端, 這里的模擬場景是通過服務端來對外提供文章的增、刪、查服務, 文章的查詢方式包括兩種: 1.查詢服務器所有文章內容。2.根據文章ID查詢某篇文章的內容。5Yq28資訊網——每日最新資訊28at.com

文章的屬性包括三個字段: 文章ID、文章標題、文章內容, 這里可以用一個結構體表示:5Yq28資訊網——每日最新資訊28at.com

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

由于我們設計了四個功能接口, 將其轉換成接口代碼框架如下:5Yq28資訊網——每日最新資訊28at.com

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

3.功能代碼實現

5Yq28資訊網——每日最新資訊28at.com

首先來實現獲取所有文章的接口, 具體參考代碼如下:5Yq28資訊網——每日最新資訊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  }  // 從原始數據源獲取文章列表  json.NewEncoder(w).Encode(Articles)  // 將文章列表存入緩存  articleCache.Store("all", Articles)}

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

接下來實現第二個接口,通過文章ID來查詢, 實現參考代碼如下:5Yq28資訊網——每日最新資訊28at.com

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

首先將傳入的ID參數在緩存中進行查找, 找到則直接返回JSON數據。如果沒有找到則繼續在文章列表中查找, 并將單篇文章存入緩存。5Yq28資訊網——每日最新資訊28at.com

創建文章接口參考代碼如下:5Yq28資訊網——每日最新資訊28at.com

// 創建文章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)}

創建文章列表需要注意的是, 這里為了維護緩存一致性,避免臟數據, 對緩存進行了清空, 以便下次GetArticles()時更新最新的緩存。5Yq28資訊網——每日最新資訊28at.com

同理也不難實現刪除文章的接口:5Yq28資訊網——每日最新資訊28at.com

// 刪除文章func DeleteArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 清除單個文章緩存  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函數中, 我們需要往列表中添加一些數據來模擬服務端保存的文章數, 并且定義四個接口的路由, 整體代碼如下:5Yq28資訊網——每日最新資訊28at.com

package mainimport (  "encoding/json"  "log"  "net/http"  "sync"  "github.com/gorilla/mux")// Article 結構體表示 API 中的數據模型type Article struct {  ID string `json:"id,omitempty"`  Title string `json:"title,omitempty"`  Content string `json:"content,omitempty"`}// Articles 數組用于存儲文章數據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  }  // 從原始數據源獲取文章列表  json.NewEncoder(w).Encode(Articles)  // 將文章列表存入緩存  articleCache.Store("all", Articles)}// 獲取單個文章func GetArticle(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Content-Type", "application/json")  params := mux.Vars(r)  // 嘗試從緩存中獲取單個文章  if cachedArticle, found := articleCache.Load(params["id"]); found {    json.NewEncoder(w).Encode(cachedArticle)    return  }  // 從原始數據源獲取單個文章  for _, article := range Articles {    if article.ID == params["id"] {      json.NewEncoder(w).Encode(article)      // 將單個文章存入緩存      articleCache.Store(params["id"], article)      return    }  }  json.NewEncoder(w).Encode(&Article{})}// 創建文章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)  // 清除單個文章緩存  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() {  // 初始化數據  Articles = append(Articles, Article{ID: "1", Title: "Article 1", Content: "Content 1"})  Articles = append(Articles, Article{ID: "2", Title: "Article 2", Content: "Content 2"})  // 創建路由器  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)  // 啟動服務器  log.Fatal(http.ListenAndServe(":8080", router))}

4.實際運行效果

5Yq28資訊網——每日最新資訊28at.com

在本地運行服務端, 服務端將在本地監聽8080端口, 通過瀏覽器輸入: http://127.0.0.1:8080/articles, 該接口將獲取所有文章,如圖:5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

通過API接口通過文章ID查詢某一篇文章,接口請求如下:5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

新增一條新文章是POST請求, 這里主要通過Apifox發送POST請求,如圖:5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

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

5Yq28資訊網——每日最新資訊28at.com

新記錄確實添加成功。5Yq28資訊網——每日最新資訊28at.com

最后, 還是通過Apifox,我們發送一個刪除ID為2的文章請求,如圖:5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

從Apifox返回的結果來看,確實刪除成功了,  現在再獲取一下全部文章,如圖:5Yq28資訊網——每日最新資訊28at.com

5Yq28資訊網——每日最新資訊28at.com

所有接口全部驗證成功。5Yq28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-56402-0.html用Go實現一個帶緩存的REST API服務端

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

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

標簽:
  • 熱門焦點
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業發布的ESG報告。ESG是“環境保
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • iQOO 11S評測:行業唯一的200W標準版旗艦

    【Techweb評測】去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,該機不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 石泉县| 龙岩市| 腾冲县| 敦化市| 兰州市| 敦煌市| 莎车县| 临泉县| 广南县| 云林县| 册亨县| 兴仁县| 环江| 穆棱市| 庐江县| 庆城县| 军事| 永年县| 茂名市| 博野县| 肥西县| 永丰县| 清流县| 金门县| 溧阳市| 洞头县| 黄骅市| 淮安市| 娱乐| 叙永县| 德清县| 布尔津县| 墨玉县| 冕宁县| 宁海县| 小金县| 苍南县| 平顶山市| 若羌县| 锡林浩特市| 红桥区|