当前位置:首页 > 科技  > 软件

REST API设计模式和反模式

来源: 责编: 时间:2023-10-31 10:26:36 233观看
导读RESTful API已经成为构建现代网络应用的事实标准。它们允许一个灵活和可扩展的架构,可以很容易地被广泛的客户端所消费。然而,设计一个既健壮又可维护的REST API是很有挑战性的,特别是对于刚入行的开发者。在这篇文章中,

RESTful API已经成为构建现代网络应用的事实标准。它们允许一个灵活和可扩展的架构,可以很容易地被广泛的客户端所消费。然而,设计一个既健壮又可维护的REST API是很有挑战性的,特别是对于刚入行的开发者。ynW28资讯网——每日最新资讯28at.com

在这篇文章中,我们将探讨一些常见的REST API设计模式和开发者应该注意的反模式。我们还将提供Golang和Open API Schema的代码片段来帮助说明这些概念。ynW28资讯网——每日最新资讯28at.com

ynW28资讯网——每日最新资讯28at.com

一、REST API设计模式

1.以资源为导向的架构(ROA)

面向资源的架构(ROA)是一种设计模式,强调资源在RESTful API中的重要性。资源是RESTful API的关键构件,它们应该被设计成易于消费和操作的方式。ynW28资讯网——每日最新资讯28at.com

在Golang中实现ROA的一种方式是使用gorilla/mux包进行路由。这里有一个例子:ynW28资讯网——每日最新资讯28at.com

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参数来定义资源。下面是一个例子:ynW28资讯网——每日最新资讯28at.com

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

2. HATEOAS

超媒体作为应用状态的引擎(HATEOAS)是一种设计模式,允许客户动态地浏览RESTful API。API提供超媒体链接,客户可以按照这些链接来发现资源并与之互动。ynW28资讯网——每日最新资讯28at.com

为了在GoLang中实现HATEOAS,你可以使用go-jsonapi包。这里有一个例子:ynW28资讯网——每日最新资讯28at.com

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参数来定义超媒体链接。这里有一个例子:ynW28资讯网——每日最新资讯28at.com

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

二、REST API反模式

1.RPC式的API

远程过程调用(RPC)风格的API是RESTful API设计中一个常见的反模式。RPC风格的API暴露了直接映射到底层实现的方法,而不是专注于资源。ynW28资讯网——每日最新资讯28at.com

下面是一个GoLang中RPC风格API的例子:ynW28资讯网——每日最新资讯28at.com

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参数来定义RPC风格的API。下面是一个例子:ynW28资讯网——每日最新资讯28at.com

paths: /users: get: operationId: getUser

2.过度的工程设计

过度工程是RESTful API设计中另一个常见的反模式。当开发者试图预测每一个可能的用例并建立一个复杂的API来适应它们时,就会出现过度设计。ynW28资讯网——每日最新资讯28at.com

这里有一个Golang中过度工程的例子:ynW28资讯网——每日最新资讯28at.com

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扩展定义过度工程。这里有一个例子:ynW28资讯网——每日最新资讯28at.com

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

总结

设计一个既健壮又可维护的RESTful API可能具有挑战性,但通过遵循最佳实践并避免常见的反模式,开发人员可以创建易于消费和操作的API。在这篇文章中,我们探讨了一些常见的REST API设计模式和反模式,并提供了GoLang和Open API Schema的代码片段来帮助说明这些概念。ynW28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-16029-0.htmlREST API设计模式和反模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ESlint 终于把这个大麻烦解决了!

下一篇: Mybatis-Plus很好,但是我被它坑了!

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • SpringBoot中使用Cache提升接口性能详解

    SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 当家的盒马,加速谋生

    当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
Top
Baidu
map