RESTful風格

帶著問題,找答案:

通過本片文章,你會了解以下四點。并且我會給出go語言的實現案例。

1、了解restful風格的來源、起源、演變史

2、了解restful風格的定義、含義

3、掌握restful風格的簡單運用

4、做一個小demo

在restful中前進,是一個非常有趣的過程。

一、他打哪來?為解決什么而去?

1、他爹是誰?

是個叫Roy Fielding的博士,是曾經參與開發http協議(現在上網的基礎規則)的主力之一。

2、為啥發明?

2000年那會,網上資源凌亂不堪。傳遞信息時。前后端交互時,亂操作http (如:用GET、POST亂傳參數)。大佬不愧是大佬,roy fielding博士,敏銳的發現這一點。并在自己的論文中書寫出了一種規則(風格)。試圖平息這場混亂。(“讓網絡資源,能像圖書館中的書記一樣管理”)

目標是:讓Web服務?簡單可擴展(加服務器就能扛更多人訪問)、無狀態(服務器不記仇,每次請求獨立)

二、restful的具體表現?

1、一切皆“資源”

互聯網上的(用戶、訂單、圖片...),每個資源都有一個唯一地址(URL),
比如: http://api.com/users (代表所有用戶)

2、用HTTP動詞操作資源

動作HTTP動詞例子作用
GETGET /users/101獲取101號用戶信息
POSTPOST /users創建新用戶
改(全量)PUTPUT /users/101更新101號全部信息
DELETEDELETE /users/101刪除101號用戶
改(局部)PATCHPATCH /users/101只改用戶昵稱

3、返回必帶狀態碼

  • 200 ok:成功
  • 201 Created:創建成功
  • 404 Not Found:資源不存在

....

三、Restful的意義!

1、結束的時代,從前url隨意設定。如:/getUser?id=1、/delete_order?oid=2...
? ? ?現在通過URL+HTTP動詞,讓全天下的程序員都能看懂。

2、只要按照這一套標準、這同一種風格。無論是go還是C、C++、Java等其他語言。都能通過接口調用,流暢的配合實現某種功能。

3、冪等安全:冪-就是多次。同一操作,連續執行多次,效果是一樣的。如delete一個條數據多次,效果與僅delete一次,是相同的。

在進行實戰演練前,你需要掌握(go基礎知識、http相關知識、數據庫相關知識)

四、實戰演練

跟著本博主的思路,一點一點來,包教會。

第一步:通過一個及其簡單的代碼入門。

1、入門版:

目標:掌握·通過http動詞變換進行不同的操作

package mainimport ("encoding/json""net/http"
)// 用戶結構體
type User struct {ID   int    `json:"id"`Name string `json:"name"`
}// 內存存儲(代替數據庫)
var users = []User{{ID: 1, Name: "張三"},{ID: 2, Name: "李四"},
}func main() {// 注冊路由:處理 /users 的所有請求http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {// 設置響應頭(告訴客戶端返回的是JSON)w.Header().Set("Content-Type", "application/json")switch r.Method {case "GET": // 獲取用戶列表json.NewEncoder(w).Encode(users)case "POST": // 創建新用戶var newUser User// 解析客戶端發來的JSON數據if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {w.WriteHeader(http.StatusBadRequest) // 400 錯誤return}// 模擬ID生成newUser.ID = len(users) + 1users = append(users, newUser)w.WriteHeader(http.StatusCreated) // 201 創建成功json.NewEncoder(w).Encode(newUser)default:w.WriteHeader(http.StatusMethodNotAllowed) // 405 不允許的方法}})// 啟動服務器(端口8080)http.ListenAndServe(":8080", nil)
}

2、基礎版:

將入門版本的拓展開來:通過函數調用實現。

package mainimport ("encoding/json" // 用于JSON處理"fmt"           // 格式化輸出"log"           // 日志記錄"net/http"      // HTTP服務
)// 定義用戶結構體(相當于數據模型)
type User struct {ID   int    `json:"id"`   // 用戶IDName string `json:"name"` // 用戶名
}// 內存數據庫(暫時替代真實數據庫)
var users = []User{{ID: 1, Name: "小明"},{ID: 2, Name: "小紅"},
}func main() {fmt.Println("👉 啟動RESTful服務器: http://localhost:8080")// 注冊路由:當訪問 /users 時觸發處理函數http.HandleFunc("/users", usersHandler)// 啟動服務器(監聽8080端口)log.Fatal(http.ListenAndServe(":8080", nil))
}// 處理/users路由的請求
func usersHandler(w http.ResponseWriter, r *http.Request) {// 設置響應頭(告訴瀏覽器返回的是JSON)w.Header().Set("Content-Type", "application/json")switch r.Method {case "GET": // 處理GET請求(查詢用戶)handleGetUsers(w, r)case "POST": // 處理POST請求(創建用戶)handleCreateUser(w, r)default: // 其他請求方法不允許w.WriteHeader(http.StatusMethodNotAllowed) // 405錯誤fmt.Fprintf(w, `{"error": "不支持該方法"}`)}
}// 處理GET請求(獲取所有用戶)
func handleGetUsers(w http.ResponseWriter, r *http.Request) {// 將用戶列表轉為JSON格式jsonData, err := json.Marshal(users)if err != nil {w.WriteHeader(http.StatusInternalServerError) // 500錯誤fmt.Fprintf(w, `{"error": "數據轉換失敗"}`)return}// 返回JSON數據w.Write(jsonData)
}// 處理POST請求(創建新用戶)
func handleCreateUser(w http.ResponseWriter, r *http.Request) {// 1. 解析請求中的JSON數據var newUser Usererr := json.NewDecoder(r.Body).Decode(&newUser)if err != nil {w.WriteHeader(http.StatusBadRequest) // 400錯誤fmt.Fprintf(w, `{"error": "無效的JSON數據"}`)return}// 2. 簡單的數據驗證if newUser.Name == "" {w.WriteHeader(http.StatusBadRequest)fmt.Fprintf(w, `{"error": "用戶名不能為空"}`)return}// 3. 生成新ID(實際項目中數據庫會自動生成)newUser.ID = len(users) + 1// 4. 添加到用戶列表users = append(users, newUser)// 5. 返回創建成功的響應w.WriteHeader(http.StatusCreated) // 201狀態碼json.NewEncoder(w).Encode(newUser)
}
原理圖:?
  客戶端 (瀏覽器/curl)│▼HTTP請求(GET/POST)│▼Go服務器 (main.go)│├── GET /users → 返回用戶列表│└── POST /users → 創建新用戶│    ├── 解析JSON│    ├── 驗證數據│    └── 添加到內存│▼HTTP響應(JSON數據)

3、進階版:

添加獲取單個用戶功能GET / users / {id} )(如:get/users/1)

// 在main函數中添加新路由
func main() {// ...原有代碼...http.HandleFunc("/users/", userHandler) // 添加帶ID的路由
}// 新增處理函數
func userHandler(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")// 從路徑中提取ID:/users/123 → 123idStr := strings.TrimPrefix(r.URL.Path, "/users/")id, err := strconv.Atoi(idStr)if err != nil {w.WriteHeader(http.StatusBadRequest)fmt.Fprintf(w, `{"error": "無效的用戶ID"}`)return}// 查找用戶var foundUser *Userfor _, u := range users {if u.ID == id {foundUser = &ubreak}}if foundUser == nil {w.WriteHeader(http.StatusNotFound) // 404fmt.Fprintf(w, `{"error": "用戶不存在"}`)return}json.NewEncoder(w).Encode(foundUser)
}

恭喜走出新手村!

到這里,差不多,大家就已經明白了Restful風格是什么?怎么用。

后續若抽出時間,我會繼續更新呦~😉


謹記:

RESTful = 用HTTP動詞(GET/POST...)操作網絡資源(URI標識),
目標是簡單、統一、好擴展。
簡稱:"動詞操作資源地址",記住這點,你對restful的理解就能掌握90%了?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90074.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

了解GC嗎?什么是GC?

GC是什么?為什么要GC? GC( Garbage Collection ),垃圾回收,是Java與C的主要區別之一。作為Java開發者,一般不需要專門編寫內存回收和垃圾清理代碼。這是因為在Java虛擬機中,存在自動…

FDMA讀寫AXI BRAM交互:FPGA高速數據傳輸的核心技術

在圖像處理系統中,當1080P視頻流以每秒60幀的速度傳輸時,傳統DMA每幀會浪費27%的帶寬在地址管理上——而FDMA技術能將這些損失降至3%以內 現代FPGA系統中,高效數據搬運往往是性能瓶頸的關鍵所在。當你在手機上流暢播放4K視頻、在自動駕駛系統中實時處理激光雷達點云時,背后…

獨立開發A/B測試實用教程

A/B測試(A/B Testing),又稱分組測試、對照實驗,是產品開發和運營中提升轉化率、優化用戶體驗的常用方法。無論你是做App、SaaS、網站還是小程序,合理地利用A/B測試,都能幫助你用數據驅動決策,讓…

如何將iPhone備份到Mac/MacBook

許多iPhone用戶非常重視備份,但在Mac上選擇合適的備份方法可能會令人困惑。市場上有各種各樣的備份工具,找到一個既易于使用又能保存所有重要數據(如照片、視頻、消息、WhatsApp聊天記錄和聯系人)的工具至關重要。如果你正在尋找一…

Logseq 插件開發實戰四:發布到官方插件市場

🚩系列回顧 初識插件機制并實現自動壓縮粘貼的圖片國際化 I18N 與配置多語言自定義斜線命令 SlashCommand發布到官方插件市場 開源地址:logseq-plugin-image-tiny,歡迎來?。 🐞 插件上線問題記錄 問題描述 本地插件開發完成后…

[netty5: ByteToMessageCodec MessageToByteEncoder ByteToMessageDecoder]-源碼分析

ByteToMessageCodec ByteToMessageCodec 是一個結合了 ByteToMessageDecoder 和 MessageToByteEncoder 的編解碼器&#xff0c;可以實時地將字節流編碼或解碼為消息&#xff0c;反之亦然。 public abstract class ByteToMessageCodec<I> extends ChannelHandlerAdapter {…

Ubuntu20.04安裝mujoco210, mujoco-py時的報錯處理

參考 Ubantu 20.04 安裝 Mujoco210、mujoco-py、gym及報錯解決 安裝 mujoco210 創建 .mujoco 文件夾 mkdir ~/.mujoco親測必須是 .mujoco 文件夾&#xff0c;不然會報錯&#xff01; 下載 mujoco210-linux-x86_64.tar.gz 并解壓到 .mujoco 文件夾 mojoco下載地址 測試 mojo…

全志T507 音頻ALSA核心層注冊流程分析

一.ALSA核心層注冊流程分析 驅動目錄&#xff1a;kernel-4.9/sound/core/sound.c struct file_operations snd_fops {.owner THIS_MODULE,.open snd_open, (inode, file)---->struct snd_minor *mptr snd_minors[minor];---->file->f_op fops_get(mptr->f_ops…

評論區實現 前端Vue

根據后端部分定義評論區功能實現 golang后端部分-CSDN博客&#xff0c;重點需要實現三個部分&#xff0c;1.當前用戶發起新根評論請求&#xff1b;2.評論區展示部分&#xff1b;3.某一根評論的子評論展示以及回復組件顯示。 整體流程解釋 數據從后端接收&#xff0c;整體在in…

差分定位技術:原理、分類與應用場景

文章目錄 簡介基本概念位置差分偽距差分載波相位 差分定位技術精密單點定位&#xff08;PPP&#xff09;差分全球定位系統&#xff08;DGPS&#xff09;實時動態定位&#xff08;RTK&#xff09; 應用場景總結 簡介 差分定位&#xff08;Differential Positioning&#xff09;是…

tomcat的tar包轉換成rpm包的保姆級教程

環境說明 &#xff1a;centos 71. 安裝打包工具&#xff1a;yum install -y rpm-build rpmdevtools2. 創建 RPM 打包環境&#xff1a;rpmdev-setuptree?輸入之后是下面的結果~/rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS?準備 Tomcat 源碼…

【牛客算法】小美的數組刪除

文章目錄 一、題目介紹二、解題思路三、解題算法實現四、算法分析4.1 代碼邏輯4.2 逆向遍歷求MEX的設計精妙之處4.2.1 逆向遍歷:解決MEX更新的連續性4.2.2 利用MEX的單調性4.2.3 空間復用與狀態壓縮4.2.4 與問題特性的完美契合4.2.5 總結:為什么說這個設計“妙”?五、算法復…

MyBatisPlus-01-環境初始化及簡單應用

文章目錄【README】【1】springboot集成mybatis-plus配置【1.1】目錄結構【相關說明】【1.2】代碼示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表語句】【2】演示【README】 本文代碼參見&#xf…

Web爬蟲編程語言選擇指南

剛學爬蟲的小伙伴常常為選擇那種語言來寫爬蟲而煩惱&#xff0c;今天我將總結幾種語言的優劣勢&#xff0c;然后選擇適合編寫 Web爬蟲 的編程語言。這就需要我們考慮開發效率、生態庫支持、并發性能等因素。以下是主流選擇及特點跟著一起看看吧&#xff1a; 1. Python&#xff…

學習日志06 python

加油&#xff0c;今天的任務是學習面向對象編程&#xff0c;設計一個簡單的寵物管理系統&#xff08;寵物類、貓 / 狗子類&#xff09;&#xff0c;先做5道題目開啟學習狀態吧&#xff01;1 setdefault()在 Python 中&#xff0c;setdefault() 是字典&#xff08;dict&#xff…

基于Java+springboot 的車險理賠信息管理系統

源碼、數據庫、包調試源碼編號&#xff1a;S595源碼名稱&#xff1a;基于springboot 的車險理賠信息管理系統用戶類型&#xff1a;多角色&#xff0c;用戶、事故調查員、管理員數據庫表數量&#xff1a;14 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運…

MyDockFinder 綠色便攜版 | 一鍵仿Mac桌面,非常簡單

如果你既不想升級到Win11&#xff0c;又想體驗Mac桌面的高級感&#xff0c;那么MyDockFinder將是你的最佳選擇。這是一款專為Windows系統設計的桌面美化工具&#xff0c;能夠將你的桌面轉變成MacOS的風格。它提供了類似Dock欄和Finder的功能&#xff0c;讓你在不更換操作系統的…

Babylon.js 材質克隆與紋理共享:你可能遇到的問題及解決方案

在 Babylon.js 中&#xff0c;材質&#xff08;Material&#xff09;和紋理&#xff08;Texture&#xff09;的克隆行為可能會影響渲染性能和內存管理&#xff0c;尤其是在多個材質共享同一紋理的情況下。本文將探討&#xff1a;PBRMetallicRoughnessMaterial 的克隆機制&#…

信息素養復賽模擬1和模擬2的編程題標程

信息素養復賽模擬 11&#xff1a;樓層編號 #include<bits/stdc.h> using namespace std; int main(){int n, t;cin >> n >> t;int res 0;for(int i 1; i < n; i ){int x i;bool ok true;while(x){if(x % 10 t){ok false;}x / 10;}res ok;} cout &l…

Hadoop高可用集群搭建

Hadoop高可用(HA)集群是企業級大數據平臺的核心基礎設施&#xff0c;通過多主節點冗余和自動故障轉移機制&#xff0c;確保系統在單點故障時仍能正常運行。本文將詳細介紹如何基于CentOS 7搭建Hadoop 3.X高可用集群&#xff0c;涵蓋環境準備、組件配置、集群啟動及管理的全流程…