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

目录
相关文章
|
1月前
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
52 3
|
1月前
|
JSON Java API
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
23 1
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
58 0
|
1月前
|
JSON API 数据格式
构建高效Python Web应用:Flask框架与RESTful API设计实践
【2月更文挑战第17天】在现代Web开发中,轻量级框架与RESTful API设计成为了提升应用性能和可维护性的关键。本文将深入探讨如何使用Python的Flask框架来构建高效的Web服务,并通过具体实例分析RESTful API的设计原则及其实现过程。我们将从基本的应用架构出发,逐步介绍如何利用Flask的灵活性进行模块化开发,并结合请求处理、数据验证以及安全性考虑,打造出一个既符合标准又易于扩展的Web应用。
652 4
|
2月前
|
JSON 测试技术 API
一个数据驱动的API测试框架
一个数据驱动的API测试框架
|
17天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
24天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
1月前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。