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月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
110 3
|
8天前
|
JSON JavaScript 中间件
Koa框架下的RESTful API设计与实现
在现代 Web 开发中,构建高效、可维护的 API 是至关重要的。Koa 是一个流行的 Node.js Web 应用框架,它具有简洁、灵活和强大的特性,非常适合用于设计和实现 RESTful API。
|
13天前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
35 3
|
20天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
36 4
|
13天前
|
安全 API 网络架构
Python中哪个框架最适合做API?
本文介绍了Python生态系统中几个流行的API框架,包括Flask、FastAPI、Django Rest Framework(DRF)、Falcon和Tornado。每个框架都有其独特的优势和适用场景。Flask轻量灵活,适合小型项目;FastAPI高性能且自动生成文档,适合需要高吞吐量的API;DRF功能强大,适合复杂应用;Falcon高性能低延迟,适合快速API开发;Tornado异步非阻塞,适合高并发场景。文章通过示例代码和优缺点分析,帮助开发者根据项目需求选择合适的框架。
39 0
|
1月前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
10天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
22天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
23天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应