Gin框架第二天---关于API

简介: Gin框架第二天---关于API

Gin第二天


1.RESTful API


简单来说,REST的含义就是客⼾端与Web服务器之间进⾏交互的时候,使⽤HTTP协议中的4个请求⽅法代表不同的动作。它是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作


  • GET⽤来获取资源
  • POST⽤来新建资源
  • PUT⽤来更新资源
  • DELETE⽤来删除资源。


只要API程序遵循了REST⻛格,那就可以称其为RESTful API。⽬前在前后端分离的架构中,前后端基本都是通 过RESTful API来进⾏交互。


下面用Gin实现一下


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
)
func main(){
   r:=gin.Default()
   r.GET("/",func(c *gin.Context){
      c.JSON(http.StatusOK,gin.H{
         "message":"GET",
      })
   })
   r.POST("/post",func(c *gin.Context){
      c.JSON(http.StatusOK,gin.H{
         "message":"POST",
      })
   })
   r.PUT("/put",func(c *gin.Context){
      c.JSON(http.StatusOK,gin.H{
         "message":"PUT",
      })
   })
   r.DELETE("/delete",func(c *gin.Context){
      c.JSON(http.StatusOK,gin.H{
         "message":"DELETE",
      })
   })
   r.Run()
}
复制代码


image.png


2. API参数问题


我们可以通过Context的Param方法来获取API参数

先来看一段demo代码


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
   "strings"
)
func main(){
   r:=gin.Default()
   r.GET("/user/:name/*action",func(c *gin.Context){
      name:=c.Param("name")
      action:=c.Param("action")
      // strings.Trim()返回去除所有包含cutset之后的结果
      action=strings.Trim(action,"/")
      c.String(http.StatusOK,"name:"+name +"\naction:"+ action)
   })
   r.Run()
}
复制代码



image.png


但是不知道你们有没有疑惑,url里面设置API参数的地方使用:和*是什么意思,当时我也有这种困惑,但是所有的文档都没有解释这个问题,所以我就自己看了源码来解释一下。


首先点击c.Param进去context.go,然后看到


image.png


可以看到这个其实就是根据键去找对应的值,继续点击ByName()方法,来到tree.go

image.png


ps.Get()用到的就是上面的Get()函数,遍历ps参数切片找对应的name,当name相同时返回对应的值和true,否则返回false;


image.png

再往上看,是Params参数切片的定义以及Param结构体的声明,很明显的键值对,根据上面的注释也能看懂Param是一个单一的URL参数,包含一个键和一个值。


到了最上面,看到了我们疑惑的地方,这里定义了:和*,不过根据名字根本不知道这两个byte切片是干嘛的。很不理解其他地方的注释都很详细,为什么这两个最令人困惑的地方定义居然一点注释都没有!!!

既然这样我们继续深挖,tree.go定义了这两个切片,后面肯定有使用到的地方,从使用的地方说不定能看出它们的作用。果不其然,继续往后翻可以看到一个查找通配符的函数

image.png


上面的注释,查找一个通配符字段并且检查无效字符名称,没有找到通配符就返回-1

这其实还是没解决我们这个问题,在看函数内部的注释,通配符以:开始(参数)或者*开始(获取全部)


到这里我们就把这个困惑解决了,当以:开头的通配符只匹配一个参数,以*开头的就把后面的所有内容全部匹配。


知道了规则之后我们再来写点测试用例试试


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
   "strings"
)
func main(){
   r:=gin.Default()
   r.GET("/user/:name/:xxx/*action",func(c *gin.Context){
      name:=c.Param("name")
      xxx:=c.Param("xxx")
      action:=c.Param("action")
      // strings.Trim()返回去除所有包含cutset之后的结果
      action=strings.Trim(action,"/")
      c.String(http.StatusOK,"name:"+name+"\nxxx:"+xxx+"\naction:"+ action)
   })
   r.Run()
}
复制代码


image.png


如果:出现在*之后呢?


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
   "strings"
)
func main(){
   r:=gin.Default()
   r.GET("/user/:name/*action/:xxx",func(c *gin.Context){
      name:=c.Param("name")
      xxx:=c.Param("xxx")
      action:=c.Param("action")
      // strings.Trim()返回去除所有包含cutset之后的结果
      action=strings.Trim(action,"/")
      c.String(http.StatusOK,"name:"+name+"\nxxx:"+xxx+"\naction:"+ action)
   })
   r.Run()
}
复制代码


image.png

编译器果然报错了,catch-all通配符只能在路径的最后,其实这个在tree.go中设计者就考虑到了这一点,所以如果不熟悉了解这两个通配符就可能写出的代码闹出笑话。


image.png

目录
相关文章
|
8天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
11天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
32 1
|
14天前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
18 4
|
1月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
2月前
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
59 0
|
2月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
74 0
|
2月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
123 1
|
13天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
59 6
|
2月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
2月前
|
SQL 存储 数据处理
下一篇
无影云桌面