成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

REST API設(shè)計(jì)模式和反模式

開發(fā) 架構(gòu)
在這篇文章中,我們將探討一些常見的REST API設(shè)計(jì)模式和開發(fā)者應(yīng)該注意的反模式。

RESTful API已經(jīng)成為構(gòu)建現(xiàn)代網(wǎng)絡(luò)應(yīng)用的事實(shí)標(biāo)準(zhǔn)。它們?cè)试S一個(gè)靈活和可擴(kuò)展的架構(gòu),可以很容易地被廣泛的客戶端所消費(fèi)。然而,設(shè)計(jì)一個(gè)既健壯又可維護(hù)的REST API是很有挑戰(zhàn)性的,特別是對(duì)于剛?cè)胄械拈_發(fā)者。

在這篇文章中,我們將探討一些常見的REST API設(shè)計(jì)模式和開發(fā)者應(yīng)該注意的反模式。我們還將提供Golang和Open API Schema的代碼片段來(lái)幫助說(shuō)明這些概念。

一、REST API設(shè)計(jì)模式

1.以資源為導(dǎo)向的架構(gòu)(ROA)

面向資源的架構(gòu)(ROA)是一種設(shè)計(jì)模式,強(qiáng)調(diào)資源在RESTful API中的重要性。資源是RESTful API的關(guān)鍵構(gòu)件,它們應(yīng)該被設(shè)計(jì)成易于消費(fèi)和操作的方式。

在Golang中實(shí)現(xiàn)ROA的一種方式是使用gorilla/mux包進(jìn)行路由。這里有一個(gè)例子:

r := mux.NewRouter()
r.HandleFunc("/users/{id}", getUser).Methods("GET")
r.HandleFunc("/users", createUser).Methods("POST")
r.HandleFunc("/users/{id}", updateUser).Methods("PUT")
r.HandleFunc("/users/{id}", deleteUser).Methods("DELETE")

在Open API Schema中,你可以使用path參數(shù)來(lái)定義資源。下面是一個(gè)例子:

paths:
 /users/{id}:
 get:
 …
 put:
 …
 delete:
 …
 /users:
 post:
 …

2. HATEOAS

超媒體作為應(yīng)用狀態(tài)的引擎(HATEOAS)是一種設(shè)計(jì)模式,允許客戶動(dòng)態(tài)地瀏覽RESTful API。API提供超媒體鏈接,客戶可以按照這些鏈接來(lái)發(fā)現(xiàn)資源并與之互動(dòng)。

為了在GoLang中實(shí)現(xiàn)HATEOAS,你可以使用go-jsonapi包。這里有一個(gè)例子:

type User struct {
 ID string `json:"id"`
 Name string `json:"name"`
 Links *Links `json:"links,omitempty"`
}

type Links struct {
 Self *Link `json:"self,omitempty"`
}

type Link struct {
 Href string `json:"href,omitempty"`
}

func getUser(w http.ResponseWriter, r *http.Request) {
 userID := mux.Vars(r)["id"]
 user := User{ID: userID, Name: "John Doe"}
 user.Links = &Links{
 Self: &Link{Href: fmt.Sprintf("/users/%s", userID)},
 }
 jsonapi.MarshalOnePayload(w, &user)
}

在Open API Schema中,你可以使用links參數(shù)來(lái)定義超媒體鏈接。這里有一個(gè)例子:

paths:
 /users/{id}:
 get:
 responses:
 '200':
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/User'
 links:
 self:
 href: '/users/{id}'

二、REST API反模式

1.RPC式的API

遠(yuǎn)程過(guò)程調(diào)用(RPC)風(fēng)格的API是RESTful API設(shè)計(jì)中一個(gè)常見的反模式。RPC風(fēng)格的API暴露了直接映射到底層實(shí)現(xiàn)的方法,而不是專注于資源。

下面是一個(gè)GoLang中RPC風(fēng)格API的例子:

func getUser(w http.ResponseWriter, r *http.Request) {
 userID := r.FormValue("id")
 user := userService.GetUser(userID)
 json.NewEncoder(w).Encode(user)
}

在Open API Schema中,你可以使用operationId參數(shù)來(lái)定義RPC風(fēng)格的API。下面是一個(gè)例子:

paths:
 /users:
 get:
 operationId: getUser

2.過(guò)度的工程設(shè)計(jì)

過(guò)度工程是RESTful API設(shè)計(jì)中另一個(gè)常見的反模式。當(dāng)開發(fā)者試圖預(yù)測(cè)每一個(gè)可能的用例并建立一個(gè)復(fù)雜的API來(lái)適應(yīng)它們時(shí),就會(huì)出現(xiàn)過(guò)度設(shè)計(jì)。

這里有一個(gè)Golang中過(guò)度工程的例子:

func getUser(w http.ResponseWriter, r *http.Request) {
 userID := mux.Vars(r)["id"]
 user, err := userService.GetUser(userID)
 if err != nil {
 handleError(w, err)
 return
 }
 json.NewEncoder(w).Encode(user)
}

func createUser(w http.ResponseWriter, r *http.Request) {
 var user User
 err := json.NewDecoder(r.Body).Decode(&user)
 if err != nil {
 handleError(w, err)
 return
 }
 user.ID = uuid.New().String()
 user.CreatedAt = time.Now()
 user.UpdatedAt = time.Now()
 err = userService.CreateUser(user)
 if err != nil {
 handleError(w, err)
 return
 }
 json.NewEncoder(w).Encode(user)
}

func updateUser(w http.ResponseWriter, r *http.Request) {
 userID := mux.Vars(r)["id"]
 var user User
 err := json.NewDecoder(r.Body).Decode(&user)
 if err != nil {
 handleError(w, err)
 return
 }
 user.ID = userID
 user.UpdatedAt = time.Now()
 err = userService.UpdateUser(user)
 if err != nil {
 handleError(w, err)
 return
 }
 json.NewEncoder(w).Encode(user)
}

func deleteUser(w http.ResponseWriter, r *http.Request) {
 userID := mux.Vars(r)["id"]
 err := userService.DeleteUser(userID)
 if err != nil {
 handleError(w, err)
 return
 }
 w.WriteHeader(http.StatusNoContent)
}

func handleError(w http.ResponseWriter, err error) {
 w.WriteHeader(http.StatusInternalServerError)
 fmt.Fprint(w, err. Error())
}

在Open API Schema中,你可以使用x-go-genie擴(kuò)展定義過(guò)度工程。這里有一個(gè)例子:

paths:
 /users/{id}:
   get:
     x-go-genie:
       serviceName: UserService
       methodName: GetUser
   put:
     x-go-genie:
       serviceName: UserService
       methodName: UpdateUser
   delete:
     x-go-genie:
       serviceName: UserService
       methodName: DeleteUser
 /users:
   post:
     x-go-genie:
       serviceName: UserService
       methodName: CreateUser

總結(jié)

設(shè)計(jì)一個(gè)既健壯又可維護(hù)的RESTful API可能具有挑戰(zhàn)性,但通過(guò)遵循最佳實(shí)踐并避免常見的反模式,開發(fā)人員可以創(chuàng)建易于消費(fèi)和操作的API。在這篇文章中,我們探討了一些常見的REST API設(shè)計(jì)模式和反模式,并提供了GoLang和Open API Schema的代碼片段來(lái)幫助說(shuō)明這些概念。

責(zé)任編輯:趙寧寧 來(lái)源: 愛發(fā)白日夢(mèng)的后端
相關(guān)推薦

2022-02-10 23:38:23

API架構(gòu)設(shè)計(jì)

2010-12-02 10:30:09

Apache Hado反模式Map Reduce

2021-01-11 05:37:54

倉(cāng)儲(chǔ)模式接口

2013-01-16 14:45:47

HadoopApache Hado

2023-09-13 11:58:17

云原生反模式

2021-02-01 10:01:58

設(shè)計(jì)模式 Java單例模式

2011-05-24 09:30:26

Findbugs

2021-04-19 21:25:48

設(shè)計(jì)模式到元

2023-11-02 21:11:11

JavaScript設(shè)計(jì)模式

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2023-05-04 08:47:31

命令模式抽象接口

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2020-11-04 08:54:54

狀態(tài)模式

2023-04-10 09:20:13

設(shè)計(jì)模式訪客模式

2020-11-03 13:05:18

命令模式

2013-11-26 16:09:34

Android設(shè)計(jì)模式

2020-10-23 09:40:26

設(shè)計(jì)模式

2012-02-02 09:21:39

編程

2024-04-24 13:45:00

2021-10-29 05:53:51

前端測(cè)試開發(fā)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成年人在线观看视频 | 日韩精品免费视频 | 国精日本亚洲欧州国产中文久久 | 91精品国产91久久久久久最新 | 日韩视频一区二区 | 日韩av一区二区在线观看 | 一级做a爰片性色毛片16 | 国产成人一区二区三区 | 精品视频一区二区三区 | 国产成人午夜电影网 | 婷婷福利视频导航 | 在线不卡一区 | 午夜精品视频一区 | 国产高清精品一区二区三区 | 国产成人精品一区二区三区视频 | 国产精品国产三级国产aⅴ中文 | 亚洲美女视频 | 99re视频| caoporn免费 | 国产亚洲第一页 | 北条麻妃99精品青青久久 | 国产亚洲精品美女久久久久久久久久 | 日本国产欧美 | 久久久久久久久久久福利观看 | 国产精品高潮呻吟 | 看片91 | 国产乱码精品1区2区3区 | 亚洲欧美激情精品一区二区 | 国产精品久久久久久52avav | 精品视频在线观看 | 99国产精品一区二区三区 | 亚洲精品99久久久久久 | 亚洲欧美在线观看 | 亚洲欧美综合 | 日韩一区二区三区av | 国产精品精品久久久久久 | 91新视频| 男人的天堂久久 | 精品一区二区久久久久久久网站 | 在线观看免费av网 | 亚洲永久精品国产 |