版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第基于Go語(yǔ)言構(gòu)建RESTfulAPI服務(wù)目錄什么是RESTfulAPI
一個(gè)簡(jiǎn)單的RESTfulAPI
RESTfulJSONAPI
Gin框架
引入Gin框架
使用Gin框架
新增一個(gè)用戶(hù)
獲取特定的用戶(hù)
總結(jié)
在實(shí)際開(kāi)發(fā)項(xiàng)目中,你編寫(xiě)的服務(wù)可以被其他服務(wù)使用,這樣就組成了微服務(wù)的架構(gòu);也可以被前端調(diào)用,這樣就可以前后端分離。那么,本文主要介紹什么是RESTfulAPI,以及Go語(yǔ)言是如何玩轉(zhuǎn)RESTfulAPI的。
什么是RESTfulAPI
RESTfulAPI是一套規(guī)范,它可以規(guī)范我們?nèi)绾螌?duì)服務(wù)器上的資源進(jìn)行操作。在了解RESTfulAPI之前,我先為你介紹下HTTPMethod,因?yàn)镽ESTfulAPI和它是密不可分的。
說(shuō)起HTTPMethod,最常見(jiàn)的就是POST和GET,其實(shí)最早在HTTP0.9版本中,只有一個(gè)GET方法,該方法是一個(gè)冪等方法,用于獲取服務(wù)器上的資源,也就是我們?cè)跒g覽器中直接輸入網(wǎng)址回車(chē)請(qǐng)求的方法。
在HTTP1.0版本中又增加了HEAD和POST方法,其中常用的是POST方法,一般用于給服務(wù)端提交一個(gè)資源,導(dǎo)致服務(wù)器的資源發(fā)生變化。
隨著網(wǎng)絡(luò)越來(lái)越復(fù)雜,發(fā)現(xiàn)這兩個(gè)方法是不夠用的,就繼續(xù)新增了方法。所以在HTTP1.1版本的時(shí)候,一口氣增加到了9個(gè),新增的方法有HEAD、OPTIONS、PUT、DELETE、TRACE、PATCH和CONNECT。下面我為你一一介紹它們的作用。
GET方法可請(qǐng)求一個(gè)指定資源的表示形式,使用GET的請(qǐng)求應(yīng)該只被用于獲取數(shù)據(jù)。
HEAD方法用于請(qǐng)求一個(gè)與GET請(qǐng)求的響應(yīng)相同的響應(yīng),但沒(méi)有響應(yīng)體。
POST方法用于將實(shí)體提交到指定的資源,通常導(dǎo)致服務(wù)器上的狀態(tài)變化或副作用。
PUT方法用于請(qǐng)求有效載荷替換目標(biāo)資源的所有當(dāng)前表示。
DELETE方法用于刪除指定的資源。
CONNECT方法用于建立一個(gè)到由目標(biāo)資源標(biāo)識(shí)的服務(wù)器的隧道。
OPTIONS方法用于描述目標(biāo)資源的通信選項(xiàng)。
TRACE方法用于沿著到目標(biāo)資源的路徑執(zhí)行一個(gè)消息環(huán)回測(cè)試。
PATCH方法用于對(duì)資源應(yīng)用部分修改。
從以上每個(gè)方法的介紹可以看到,HTTP規(guī)范針對(duì)每個(gè)方法都給出了明確的定義,所以我們使用的時(shí)候也要盡可能地遵循這些定義,這樣我們?cè)陂_(kāi)發(fā)中才可以更好地協(xié)作。
理解了這些HTTP方法,就可以更好地理解RESTfulAPI規(guī)范了,因?yàn)镽ESTfulAPI規(guī)范就是基于這些HTTP方法規(guī)范我們對(duì)服務(wù)器資源的操作,同時(shí)規(guī)范了URL的樣式和HTTPStatusCode。
在RESTfulAPI中,使用的主要是以下五種HTTP方法:
GET,表示讀取服務(wù)器上的資源;
POST,表示在服務(wù)器上創(chuàng)建資源;
PUT,表示更新或者替換服務(wù)器上的資源;
DELETE,表示刪除服務(wù)器上的資源;
PATCH,表示更新/修改資源的一部分。
以上HTTP方法在RESTfulAPI規(guī)范中是一個(gè)操作,操作的就是服務(wù)器的資源,服務(wù)器的資源通過(guò)特定的URL表示。
現(xiàn)在我們通過(guò)一些示例讓你更好地理解RESTfulAPI,如下所示:
HTTPGEThttp://localhost:1000/users
HTTPGEThttp://localhost:1000/user/123
以上是兩個(gè)GET方法的示例:
第一個(gè)表示獲取所有用戶(hù)的信息
第二個(gè)表示獲取ID為123用戶(hù)的信息
下面再看一個(gè)POST方法的示例,如下所示:
HTTPPOSThttp://localhost:1000/user
這個(gè)示例表示創(chuàng)建一個(gè)用戶(hù),通過(guò)POST方法給服務(wù)器提供創(chuàng)建這個(gè)用戶(hù)所需的全部信息。
現(xiàn)在你已經(jīng)知道了如何創(chuàng)建一個(gè)用戶(hù),那么如果要更新某個(gè)特定的用戶(hù)怎么做呢?其實(shí)也非常簡(jiǎn)單,示例代碼如下所示:
HTTPPUThttp://localhost:1000/user/123
這表示要更新/替換ID為123的這個(gè)用戶(hù),在更新的時(shí)候,會(huì)通過(guò)PUT方法提供更新這個(gè)用戶(hù)需要的全部用戶(hù)信息。這里PUT方法和POST方法不太一樣的是,從URL上看,PUT方法操作的是單個(gè)資源,比如這里ID為123的用戶(hù)。
看到這里,相信你已經(jīng)知道了如何刪除一個(gè)用戶(hù),示例代碼如下所示:
HTTPDELETEhttp://localhost:1000/user/123
DELETE方法的使用和PUT方法一樣,也是操作單個(gè)資源,這里是刪除ID為123的這個(gè)用戶(hù)。
一個(gè)簡(jiǎn)單的RESTfulAPI
相信你已經(jīng)非常了解什么是RESTfulAPI了,現(xiàn)在開(kāi)始,我會(huì)帶你通過(guò)一個(gè)使用Golang實(shí)現(xiàn)RESTfulAPI風(fēng)格的示例,加深RESTfulAPI的理解。
Go語(yǔ)言的一個(gè)很大的優(yōu)勢(shì),就是可以很容易地開(kāi)發(fā)出網(wǎng)絡(luò)后臺(tái)服務(wù),而且性能快、效率高。在開(kāi)發(fā)后端HTTP網(wǎng)絡(luò)應(yīng)用服務(wù)的時(shí)候,我們需要處理很多HTTP的請(qǐng)求訪(fǎng)問(wèn),比如常見(jiàn)的RESTfulAPI服務(wù),就要處理很多HTTP請(qǐng)求,然后把處理的信息返回給使用者。對(duì)于這類(lèi)需求,Golang提供了內(nèi)置的net/http包幫我們處理這些HTTP請(qǐng)求,讓我們可以比較方便地開(kāi)發(fā)一個(gè)HTTP服務(wù)。
下面我們來(lái)看一個(gè)簡(jiǎn)單的HTTP服務(wù)的Go語(yǔ)言實(shí)現(xiàn),代碼如下所示:
funcmain(){
http.HandleFunc("/users",handleUsers)
http.ListenAndServe(":1000",nil)
funchandleUsers(whttp.ResponseWriter,r*http.Request){
fmt.Fprintln(w,"ID:1,Name:張三")
fmt.Fprintln(w,"ID:2,Name:李四")
fmt.Fprintln(w,"ID:3,Name:王五")
這個(gè)示例運(yùn)行后,你在瀏覽器中輸入http://localhost:1000/users,就可以看到如下內(nèi)容信息:
ID:1,Name:張三
ID:2,Name:李四
ID:3,Name:王五
也就是獲取所有的用戶(hù)信息,但是這并不是一個(gè)RESTfulAPI,因?yàn)槭褂谜卟粌H可以通過(guò)HTTPGET方法獲得所有的用戶(hù)信息,還可以通過(guò)POST、DELETE、PUT等HTTP方法獲得所有的用戶(hù)信息,這顯然不符合RESTfulAPI的規(guī)范。
現(xiàn)在我對(duì)以上示例進(jìn)行修改,使它符合RESTfulAPI的規(guī)范,修改后的示例代碼如下所示:
funchandleUsers(whttp.ResponseWriter,r*http.Request){
switchr.Method{
case"GET":
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w,"ID:1,Name:張三")
fmt.Fprintln(w,"ID:2,Name:李四")
fmt.Fprintln(w,"ID:3,Name:王五")
default:
w.WriteHeader(http.StatusNotFound)
fmt.Fprintln(w,"notfound")
}
這里我只修改了handleUsers函數(shù),在該函數(shù)中增加了只在使用GET方法時(shí),才獲得所有用戶(hù)的信息,其他情況返回notfound。
現(xiàn)在再運(yùn)行這個(gè)示例,會(huì)發(fā)現(xiàn)只能通過(guò)HTTPGET方法進(jìn)行訪(fǎng)問(wèn)了,使用其他方法會(huì)提示notfound。
RESTfulJSONAPI
在項(xiàng)目中最常見(jiàn)的是使用JSON格式傳輸信息,也就是我們提供的RESTfulAPI要返回JSON內(nèi)容給使用者。
同樣用上面的示例,我把它改造成可以返回JSON內(nèi)容的方式,示例代碼如下所示:
//數(shù)據(jù)源,類(lèi)似MySQL中的數(shù)據(jù)
varusers=[]User{
{ID:1,Name:"張三"},
{ID:2,Name:"李四"},
{ID:3,Name:"王五"},
funchandleUsers(whttp.ResponseWriter,r*http.Request){
switchr.Method{
case"GET":
users,err:=json.Marshal(users)
iferr!=nil{
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w,"{\"message\":\""+err.Error()+"\"}")
}else{
w.WriteHeader(http.StatusOK)
w.Write(users)
default:
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w,"{\"message\":\"notfound\"}")
typeUserstruct{
IDint
Namestring
從以上代碼可以看到,這次的改造主要是新建了一個(gè)User結(jié)構(gòu)體,并且使用users這個(gè)切片存儲(chǔ)所有的用戶(hù),然后在handleUsers函數(shù)中把它轉(zhuǎn)化為一個(gè)JSON數(shù)組返回。這樣,就實(shí)現(xiàn)了基于JSON數(shù)據(jù)格式的RESTfulAPI。
運(yùn)行這個(gè)示例,在瀏覽器中輸入http://localhost:1000/users,可以看到如下信息:
[{"ID":1,"Name":"張三"},{"ID":2,"Name":"李四"},{"ID":3,"Name":"王五"}]
這已經(jīng)是JSON格式的用戶(hù)信息,包含了所有用戶(hù)。
Gin框架
雖然Go語(yǔ)言自帶的net/http包,可以比較容易地創(chuàng)建HTTP服務(wù),但是它也有很多不足:
不能單獨(dú)地對(duì)請(qǐng)求方法(POST、GET等)注冊(cè)特定的處理函數(shù)
不支持Path變量參數(shù)
不能自動(dòng)對(duì)Path進(jìn)行校準(zhǔn)
性能一般
基于以上這些不足,出現(xiàn)了很多GolangWeb框架,如Mux,Gin、Fiber等,今天我要為你介紹的就是這款使用最多的Gin框架。
引入Gin框架
Gin框架是一個(gè)在Github上開(kāi)源的Web框架,封裝了很多Web開(kāi)發(fā)需要的通用功能,并且性能也非常高,可以讓我們很容易地寫(xiě)出RESTfulAPI。
Gin框架其實(shí)是一個(gè)模塊,也就是GoMod,所以采用GoMod的方法引入即可。首先需要下載安裝Gin框架,安裝代碼如下:
goget-u/gin-gonic/gin
然后就可以在Go語(yǔ)言代碼中導(dǎo)入使用了,導(dǎo)入代碼如下:
import"/gin-gonic/gin"
通過(guò)以上安裝和導(dǎo)入這兩個(gè)步驟,就可以在你的Go語(yǔ)言項(xiàng)目中使用Gin框架了。
使用Gin框架
現(xiàn)在,已經(jīng)引入了Gin框架,下面我就是用Gin框架重寫(xiě)上面的示例,修改的代碼如下所示:
funcmain(){
r:=gin.Default()
r.GET("/users",listUser)
r.Run(":1000")
funclistUser(c*gin.Context){
c.JSON(200,users)
}
相比net/http包,Gin框架的代碼非常簡(jiǎn)單,通過(guò)它的GET方法就可以創(chuàng)建一個(gè)只處理HTTPGET方法的服務(wù),而且輸出JSON格式的數(shù)據(jù)也非常簡(jiǎn)單,使用c.JSON方法即可。
最后通過(guò)Run方法啟動(dòng)HTTP服務(wù),監(jiān)聽(tīng)在1000端口?,F(xiàn)在運(yùn)行這個(gè)Gin示例,在瀏覽器中輸入http://localhost:1000/users,看到的信息和通過(guò)net/http包實(shí)現(xiàn)的效果是一樣的。
新增一個(gè)用戶(hù)
現(xiàn)在你已經(jīng)可以使用Gin獲取所有用戶(hù),還可以獲取特定的用戶(hù),那么你也應(yīng)該知道如何新增一個(gè)用戶(hù)了,現(xiàn)在我通過(guò)Gin實(shí)現(xiàn)如何新增一個(gè)用戶(hù),看和你想的方案是否相似。
根據(jù)RESTfulAPI規(guī)范,實(shí)現(xiàn)新增使用的是POST方法,并且URL的格式為http://localhost:1000/users,向這個(gè)URL發(fā)送數(shù)據(jù),就可以新增一個(gè)用戶(hù),然后返回創(chuàng)建的用戶(hù)信息。
現(xiàn)在我使用Gin框架實(shí)現(xiàn)新增一個(gè)用戶(hù),示例代碼如下:
funcmain(){
//省略沒(méi)有改動(dòng)的代碼
r.POST("/users",createUser)
funccreateUser(c*gin.Context){
name:=c.DefaultPostForm("name","")
ifname!=""{
u:=User{ID:len(users)+1,Name:name}
users=append(users,u)
c.JSON(http.StatusCreated,u)
}else{
c.JSON(http.StatusOK,gin.H{
"message":"請(qǐng)輸入用戶(hù)名稱(chēng)",
以上新增用戶(hù)的主要邏輯是獲取客戶(hù)端上傳的name值,然后生成一個(gè)User用戶(hù),最后把它存儲(chǔ)到users集合中,達(dá)到新增用戶(hù)的目的。
在這個(gè)示例中,使用POST方法來(lái)新增用戶(hù),所以只能通過(guò)POST方法才能新增用戶(hù)成功。
現(xiàn)在運(yùn)行這個(gè)示例,然后通過(guò)如下命令發(fā)送一個(gè)新增用戶(hù)的請(qǐng)求,查看結(jié)果:
curl-XPOST-d'name=Ele'http://localhost:1000/users
{"ID":4,"Name":"Ele"}
可以看到新增用戶(hù)成功,并且返回了新增的用戶(hù),還有分配的ID。
獲取特定的用戶(hù)
現(xiàn)在你已經(jīng)掌握了如何使用Gin框架創(chuàng)建一個(gè)簡(jiǎn)單的RESTfulAPI,并且可以返回所有的用戶(hù)信息,那么如何獲取特定用戶(hù)的信息呢?
下面我通過(guò)Gin框架Path路徑參數(shù)來(lái)實(shí)現(xiàn)獲得特定用戶(hù)的信息功能,示例代碼如下:
funcmain(){
//省略沒(méi)有改動(dòng)的代碼
r.GET("/users/:id",getUser)
funcgetUser(c*gin.Context){
id:=c.Param("id")
varuserUser
found:=false
//類(lèi)似于數(shù)據(jù)庫(kù)的SQL查詢(xún)
for_,u:=rangeusers{
ifstrings.EqualFold(id,strconv.Itoa
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中級(jí)會(huì)計(jì)職稱(chēng)財(cái)務(wù)管理真題解析及答案
- 建筑用水用電節(jié)能方案設(shè)計(jì)
- 綠化護(hù)坡工程技術(shù)方案范本
- 碳纖維加固工程施工技術(shù)方案
- 保安服務(wù)公司整改措施及績(jī)效提升方案
- 物業(yè)管理公司運(yùn)營(yíng)籌備全流程方案
- 2025年企業(yè)人力資源管理師理念考核試卷及答案
- 企業(yè)財(cái)務(wù)內(nèi)部控制體系建設(shè)方案
- 醫(yī)院信息系統(tǒng)用戶(hù)操作指南與常見(jiàn)故障排查
- 工業(yè)鋼結(jié)構(gòu)防火涂料施工技術(shù)方案
- 2025年湖南省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 廈門(mén)市人教版八年級(jí)上冊(cè)期末生物期末試卷
- 2026中國(guó)鋼研鋼研納克校園招聘?jìng)淇伎荚囶}庫(kù)附答案解析
- 減速機(jī)知識(shí)培訓(xùn)資料課件
- 冷庫(kù)消防安全培訓(xùn)課件
- 普陀區(qū)一模高三數(shù)學(xué)試卷
- 光熱儲(chǔ)能電站發(fā)電項(xiàng)目項(xiàng)目管理各階段主要任務(wù)
- 2026年中考語(yǔ)文復(fù)習(xí):非連續(xù)性文本閱讀 中考真題練習(xí)題匯編(含答案解析)
- 醫(yī)療工作者榜樣學(xué)習(xí)心得體會(huì)
- 部隊(duì)安全駕駛課件
- 醫(yī)?;鸢踩褂镁窘逃?/a>
評(píng)論
0/150
提交評(píng)論