Day04:Gin框架快速入门02 请求| 青训营

简介: Day04:Gin框架快速入门02 请求| 青训营

导读

本套笔记是为了学习过其他语言框架,想要快速掌握gin框架推行的一套笔记。 虽然为了青训营而制作的一套笔记,但其他想要学go的程序员也可以通过这个上手go世界,后续会带你快速上手gorm,学完这两个之后,简体版抖音基本上就可以独立完成了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。

注意

代码详解大部分是注释的形式给出,请留意代码注释。

Gin框架介绍

导读:Gin是一个非常受欢迎的Golang Web框架,它旨在提供高性能、易用和轻量级的解决方案。

请求

在计算机编程中,"请求"指的是客户端向服务器发送的一种数据包,用于请求特定的资源或执行特定的操作。请求通常由HTTP协议进行传输。

一个请求通常包含以下几个重要的元素:

  1. 方法(Method):定义了执行的操作类型,如GET、POST、PUT、DELETE等。
  2. URL(Uniform Resource Locator):标识了服务器上要请求资源的位置。
  3. 头部信息(Headers):包含了关于请求的附加信息,例如请求的数据类型、授权信息等。
  4. 请求体(Body):对于某些请求(如POST、PUT),可以在请求体中携带需要传输的数据或参数。

服务器接收到请求后,会根据请求的方法、URL等信息来执行相应的操作,并返回响应给客户端。

我们这套笔记都是使用postman来设置请求

查询参数 Query

最基本的查询参数,postman这样设置

image.png

我们在Params(参数里面)设置查询参数即可,上面会自动补全内容。 之后我们使用goland书写代码

package main  
import (  
"fmt"  
"github.com/gin-gonic/gin" //引入框架  
)  
func main() {  
router := gin.Default() //设置路由  
router.GET("/", func(c *gin.Context) {  
fmt.Println(c.Query("name"))//获得参数name,返回获得的消息  
fmt.Println(c.GetQuery("age")) //获得参数age,返回获得消息,和一个布尔类型的判定是否获得 
fmt.Println(c.DefaultQuery("gender","1"))  //获得参数gender,如果没有设置的话设置默认值
})  
router.Run() //设置运行接口  
}

全部设置,运行结果如下

xiaoming
18 true
1

如果不设置gender,运行结果和上面一样。

动态参数 Param

package main  
import (  
"github.com/gin-gonic/gin" //引入框架  
"net/http"  
)  
func getUserHandler(c *gin.Context) {  
username := c.Param("username")  
userID := c.Param("id") // 获取名为"id"的动态参数值  
c.JSON(http.StatusOK, gin.H{"username": username, "userID": userID}) //返回json数据  
}  
func main() {  
router := gin.Default() //设置路由  
router.GET("/user/:username/:id", getUserHandler)  
router.Run() //设置运行接口  
}

接下来我们在postman上面设置参数,并且发送,可以看到返回了json数据

image.png

动态参数和查询参数的区别

动态参数和查询参数都用于在 URL 中传递参数,但它们在使用方式和作用上有一些区别。

  1. 动态参数(Dynamic Route Parameters):
  • 格式:动态参数被包裹在路由路径中,以冒号(:)开头,例如 /users/:id
  • 作用:动态参数用于捕获 URL 中的可变部分,并将其作为参数传递给处理该路由的函数。它们通常用于标识资源的唯一标识符,例如用户 ID、文章 ID 等。
  • 示例:在 /users/123 这个URL中,动态参数的名称是 "id",对应的值是 "123"。
  1. 查询参数(Query Parameters):
  • 格式:查询参数是以 ? 开始,后面跟着键值对的形式,例如 /search?q=apple&category=fruits
  • 作用:查询参数用于向服务器传递额外的信息,可以有多个键值对。它们通常用于过滤、排序、分页等操作。
  • 示例:在 /search?q=apple&category=fruits 这个 URL 中,查询参数有两个键值对:q 的值是 "apple",category 的值是 "fruits"。

表单PostForm

可以接收 multipart/form-data; application/x-www-form-urlencoded

在postman里面就是这两个

image.png

goland代码如下

package main  
import (  
"github.com/gin-gonic/gin" //引入框架  
"net/http"  
)  
func getUser(c *gin.Context) {  
username := c.PostForm("username")  //获得username
userage := c.DefaultPostForm("userage", "18") //如果没有的话,就给一个默认值18  
usergender := c.PostForm("usergender")  //获得usergender
c.JSON(http.StatusOK, gin.H{"username": username, "userage": userage, "usergender": usergender}) //返回json数据  
}  //返回json数据
func main() {  
router := gin.Default() //设置路由  
router.GET("/user", getUser)  
router.Run() //设置运行接口  
}

使用postman发送格式如下

image.png

可以看到成功响应,如果取消userage,接受的数据也不会改变。

PostFormArray()

获得一个表单的数组,其实也很简单,goland示例代码如下

package main  
import (  
"github.com/gin-gonic/gin" //引入框架  
"net/http"  
)  
func getUser(c *gin.Context) {  
username := c.PostFormArray("username") //接受username的数组  
c.JSON(http.StatusOK, gin.H{"username": username}) //返回json数据  
}  
func main() {  
router := gin.Default() //设置路由  
router.GET("/user", getUser)  
router.Run() //设置运行接口  
}

postman可以正常接收到所有的数据

image.png

接受json,返回响应信息

package main  
import (  
"github.com/gin-gonic/gin" //引入框架  
"net/http"  
)  
type User struct {  
Username string `json:"name"`  
UserAge int `json:"age"`  
UserGender int `json:"gender"`  
} //设置用户结构体  
func getUser(c *gin.Context) {  
var user User //实例化结构体  
if err := c.ShouldBindJSON(&user); err != nil {  
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})//err 有错误,返回错误信息  
return  
} //ShouldBindJSON判断是否是json,并且把user赋值  
c.JSON(http.StatusOK, gin.H{"message": "JSON data received successfully"})//没有错误,返回正确信息  
}  
func main() {  
router := gin.Default() //设置路由  
router.GET("/user", getUser)  
router.Run() //设置运行接口  
}

c.ShouldBindJSON() 是 Gin 框架的一个方法,用于将请求的 JSON 数据绑定到一个结构体或映射上。

这个方法会根据请求的 Content-Type 头部来确定如何解析请求体。如果 Content-Type 是 "application/json",则会使用 JSON 解析器解析请求体数据,并将其绑定到指定的结构体或映射上。

我们使用postman发送数据,可以看到成功响应

image.png

如果发送错误的,将会报错,例如我把age变成字符 串传入。

image.png

四大请求方式

Restful风格指的是网络应用中就是资源定位和资源操作的风格。不是标准也不是协议。

常见的 HTTP 请求方式有以下四种:

  1. GET:用于获取资源,没有副作用,可以被缓存。GET 请求将其参数以查询字符串的形式附加在 URL 中,发送给服务器。
  2. POST:用于提交数据,具有副作用,不会被缓存。POST 请求将请求体中的数据发送给服务器,通常用于创建新的资源或提交表单数据。
  3. PUT:用于更新资源,具有幂等性,即多次执行结果相同。PUT 请求将整个更新后的资源发送给服务器,用于替换指定 URI 的资源。
  4. DELETE:用于删除资源,具有幂等性,即多次执行结果相同。DELETE 请求用于删除指定 URI 的资源。

我们之前所有的代码都是用的GET来获取数据,如果要更换的话,只需要改变router.GET("/user", getUser) 把GET方法用其他方法替代,例如router.POST(),之后在postman上面也需要设置请求方式为post。而具体选用哪一个,我们到时候根据接口文档选择即可。

请求头

什么是请求头

请求头(Request Headers)是 HTTP 请求中包含的一些元数据信息,用于向服务器传递额外的请求参数和属性。请求头通常由键值对(Key-Value pairs)组成,每个键值对表示一个请求头字段和对应的值。

以下是一些常见的请求头字段及其作用:

  1. Host:指定目标服务器的主机名和端口号。
  2. User-Agent:发送请求的用户代理(浏览器、应用程序等)的标识信息。
  3. Content-Type:指定请求体的媒体类型(如 application/json、application/x-www-form-urlencoded 等)。
  4. Content-Length:指定请求体的长度。
  5. Authorization:用于身份验证的凭据,常见的有基本认证(Basic Authentication)和 Bearer Token 认证。
  6. Accept:指定客户端能够接受的响应内容类型。
  7. Cookie:包含从服务器接收到的 Cookie 信息,用于保持会话状态。
  8. Referer:指定当前请求的来源页面的 URL。

除了上述请求头字段,还有其他一些请求头字段可以用于传递各种类型的信息、控制缓存、跟踪会话等。不同的应用场景可能需要使用不同的请求头字段

获得请求头信息

image.png

postman里面设置响应头,也可以自己添加信息,我添加了一个name

package main  
import (  
"fmt"  
"github.com/gin-gonic/gin" //引入框架  
)  
func get(c *gin.Context) {  
// 首字母大小写不区分 单词与单词之间用 - 连接  
// 用于获取一个请求头  
fmt.Println(c.GetHeader("User-Agent")) 
fmt.Println(c.GetHeader("Name")) //在postman里面自己设置的信息 
}  
func main() {  
router := gin.Default() //设置路由  
router.GET("/user", get)  
router.Run() //设置运行接口  
}

发送之后成功打印出结果

PostmanRuntime/7.32.3
xiaoming

响应头

什么是响应头

响应头(Response Headers)是在服务器向客户端发送HTTP响应时,包含在响应报文中的元数据信息。它们提供了关于响应的附加信息,帮助客户端理解和处理服务器返回的内容。

常见的响应头包括:

  1. Content-Type:指定响应体的媒体类型(例如,text/html、application/json等)。
  2. Content-Length:指定响应体的长度(以字节为单位)。
  3. Date:指定响应生成的日期和时间。
  4. Server:指定服务器软件的名称和版本号。
  5. Set-Cookie:设置一个或多个Cookie,用于在客户端保存会话信息。
  6. Cache-Control:指定响应的缓存行为,如缓存有效期或不缓存等。
  7. Location:指定重定向的目标URL。

设置响应头信息

package main  
import (  
"github.com/gin-gonic/gin" //引入框架  
)  
func get(c *gin.Context) {  
c.Header("Token", "jhgeu%hsg845jUIF83jh")  //设置响应头的信息
c.Header("Content-Type", "application/text; charset=utf-8") //设置响应头信息
c.JSON(0, gin.H{"data": "响应成功"})  //返回json数据
}  
func main() {  
router := gin.Default() //设置路由  
router.GET("/user", get)  
router.Run() //设置运行接口  
}

运行之后用postman接受

image.png

image.png

可以看到body和headers里面的数据已经变成我们想要的了



相关文章
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
128 0
|
7月前
|
存储 关系型数据库 MySQL
|
前端开发 中间件 Java
Day05:Gin框架快速入门05 中间件和路由 | 青训营
Day05:Gin框架快速入门05 中间件和路由 | 青训营
|
存储 前端开发 程序员
Day05:Gin框架快速入门04 文件上传和下载| 青训营
Day05:Gin框架快速入门04 文件上传和下载| 青训营
|
XML JSON 前端开发
Day03:Gin框架快速入门01 响应| 青训营
Day03:Gin框架快速入门01 响应| 青训营
|
中间件 开发者
史上最详细的Gin中间件使用教程
1.概述 Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。
1076 13
史上最详细的Gin中间件使用教程
|
前端开发
Day04:Gin框架快速入门03 bind绑定器| 青训营(二)
Day04:Gin框架快速入门03 bind绑定器| 青训营
|
XML JSON 程序员
Day04:Gin框架快速入门03 bind绑定器| 青训营(一)
Day04:Gin框架快速入门03 bind绑定器| 青训营
|
JSON 前端开发 JavaScript
[Golang实战] 带你入手gin框架使用,以项目为例
[Golang实战] 带你入手gin框架使用,以项目为例
|
存储 前端开发
gin框架学习-文件上传
多文件上传就是一次可以上传多个文件,不需要一个文件一个文件上传,这也便于上传文件的人。
238 0
gin框架学习-文件上传