gin框架学习笔记(二) ——相关数据与文件的响应

前言

在看是今天的内容之前,我们收先来探究一下:什么是Web应用工作的原理?当然这个问题其实论述起来是很麻烦的,但是我们将它无限的缩小,其实可以简化为一个C/S模型,客户端(Client)负责发送请求,服务端(Server,也就使我们的Web应用)接收 请求,来进行相关的操作,模型如下:
在这里插入图片描述
而今天我们所要介绍的就是服务端如何进行相关数据的响应

Http响应码

在HTTP协议定义了一组状态码,用于指示服务器对请求的处理结果,这里我们只对比较常见的做一下简单介绍,想要了解更多的话大家可以参考下面这篇博文:
HTTP状态码大全(常见 HTTP Status Code 含义查询)

  • 200:成功,
  • 404:资源未找到,
  • 500:服务器内部错误

Json

在上一篇文章中我们利用gin框架实现了与浏览器的交互,在网页上面打印了hello world,这是一个很典型的响应字符串,而在响应Json中,除了一些细节以外本质上其实还是类似的,比如下面这个Json响应的代码:

package main

import (
	"github.com/gin-gonic/gin"
)

type UserInfo struct {
	Name string `json:"user"`
	Age  int    `json:"age"`
}

func toJson(c *gin.Context) { //响应Json的函数
	user := UserInfo{
		Name: "Fengxu",
		Age:  23,
	}
	c.JSON(200, user)
}

func main() {
	r := gin.Default()
	r.GET("/", toJson)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

运行我们会看到页面上出现了Json字符串:
在这里插入图片描述

关于Json响应的细节

  • Get函数
    gin 包提供了 GET 函数来定义处理 HTTP GET 请求的路由,我们来看一下Get函数的签名:
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
	return group.handle(http.MethodGet, relativePath, handlers)
}

这里有两个参数:
1.path:path 是该路由的路径,可以包含参数,例如上面的路径就是:http://127.0.0.1:8080/
2.handlers:路由处理函数,这里用了可变参数,所以这里其实可以有多个路由处理函数

  • 这里拓展一下Json响应的两种不同写法:

    • 将信息存储到map中
    func toJson(c *gin.Context) { //响应Json的函数
    	usermap := map[string]string{
    		"user": "张三",
    		"age":  "18",
    	}
    	c.JSON(200, usermap)
    }
    
    • 使用原始Json字符串
    func toJson(c *gin.Context) { //响应Json的函数
    	c.JSON(200, gin.H{"user": "zhangsan", "age": 18})
    }
    
  • 如果我们有些消息不想显示在网页上面,可以想下面这样写:

package main

import (
	"github.com/gin-gonic/gin"
)

type UserInfo struct {
	Name     string `json:"user"`
	Age      int    `json:"age"`
	password string `json:"-"`
}

func toJson(c *gin.Context) { //响应Json的函数
	user := UserInfo{
		Name:     "luoyu",
		Age:      18,
		password: "123456",
	}
	c.JSON(200, user)
}

func main() {
	r := gin.Default()
	r.GET("/", toJson)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

运行结果:
在这里插入图片描述

xml与yaml

  • Xml
package main

import (
	"github.com/gin-gonic/gin"
)

func toXml(c *gin.Context) { //响应Json的函数
	c.XML(200, gin.H{"user": "zhangsan", "age": 18})
}

func main() {
	r := gin.Default()
	r.GET("/", toXml)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

在这里插入图片描述

  • Yaml
package main

import (
	"github.com/gin-gonic/gin"
)

func toYAml(c *gin.Context) { //响应Json的函数
	c.YAML(200, gin.H{"user": "zhangsan", "age": 18})
}

func main() {
	r := gin.Default()
	r.GET("/", toYAml)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}
  • YAML
package main

import (
	"github.com/gin-gonic/gin"
)

func toYAml(c *gin.Context) { //响应Json的函数
	c.YAML(200, gin.H{"user": "zhangsan", "age": 18})
}

func main() {
	r := gin.Default()
	r.GET("/", toYAml)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

HTML

HTML与上面的几个不同,接下来我给大家演示一下如何加载一个HTML模版:

首先我们在项目里面创建一个template文件夹,然后我们创建index.html,尝试写一个简单的页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello {{.username}} 
</body>
</html>

然后我们尝试响应HTML:

package main

import (
	"github.com/gin-gonic/gin"
)

func toHtml(c *gin.Context) { //响应Json的函数
	c.HTML(200, "index.html", gin.H{"username": "fengxu"})
}

func main() {
	r := gin.Default()
	r.LoadHTMLGlob("template/*")
	r.GET("/", toHtml)
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

运行结果为:
在这里插入图片描述

注意: 我们在使用c.HTML函数签,要先加载模版文件:

func (engine *Engine) LoadHTMLFiles(files ...string)  //加载单/多个html文件
func (engine *Engine) LoadHTMLGlob(pattern string)  //加载该路径下所有的html文件

文件响应

  • 单个文件响应
    这里我准备了一张照片,我们可以尝试来将它和浏览器交互,让我们可以在网页上看到它:
    在这里插入图片描述
    首先我在项目文件夹中创建source文件夹,表示这里存放一些相关资源,在这里插入图片描述
    然后我们可以使用StaticFile来实现上述操作,代码如下:
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.StaticFile("/file", "Source/static/img.png")
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

运行结果为;
在这里插入图片描述

  • 响应指定文件夹里面的内容
    有时候我们只希望Source里面指定文件夹可以访问,但是其他的不能访问,我们可以这样来写,首先我们创建一个文件夹public,在里面创建a.txt,内容如下:
aguihylsywiop;s1yho
hjgiuzoagiusu1i

然后我们尝试来加载这个文件夹:

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	//r.StaticFile("/file", "Source/static/img.png")
	r.StaticFS("/static", http.Dir("Source/public"))
	err := r.Run(":8080")
	if err != nil {
		return
	}
}

这样我们指定文件就可以访问了:
在这里插入图片描述
补充
函数解析:

  • StaticFile:

    • StaticFile 函数用于将单个静态文件映射到指定的 URL 路径上。
    • 它接受两个参数:URL 路径和文件路径。
  • StaticFS 函数

    • 用于将一个目录中的所有静态文件映射到指定的 URL 路径上。
    • 它接受两个参数:URL 路径和目录路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/612388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ambari hdp的kafka用户授权读写权限

基于ambari hdp的kafka用户授权读写权限 版本Kafka 2.0.0添加自定义配置修改admin密码重启kafka授权读取授权写入有效通配符部分举例 版本Kafka 2.0.0 添加自定义配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

UE5 C++软引用

一.软引用通常是仅储存资源对象的资源路径没有与资源产生耦合关系的引用&#xff08;软引用加载到内存中&#xff0c;只有在需要的时候才会被加载&#xff09; 软引用通常有FSoftObjectPath、FSoftClassPath、TSoftObjectPtr、TSoftClassPtr。它指向的资源未被加载&#xff0c…

es关闭开启除了系统索引以外的所有索引

1、es 开启 “删除或关闭时索引名称支持通配符” 功能 2、kibanan平台执行 POST *,-.*/_close 关闭索引POST *,-.*/_open 打开索引3、其他命令 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 DELETE *,-.* 删除全…

Ansible-Playbook通过role角色部署Lnmp架构

目录​​​​​​​ 一、配置Nginx的Roles角色 1.1编写files/default.conf 1.2编写files/nginx.repo 1.3编写handlers/main.yml 1.4编写tasks/main.yml文件 1.5编写vars/main.yml文件 1.6测试运行结果&#xff0c;并不是真的执行任务 二、配置Mysql的Roles角色 2.1编写…

物联网D3——按键控制LED、光敏传感蜂鸣器

按键控制LED 按键抖动&#xff0c;电平发生变化&#xff0c;可用延时函数抵消按键抖动对系统的影响 传感器电路图 按键电路图 c语言对应类型 “_t”后缀表示使用typedef重命名的数据类型 枚举类型 #include<iostream> using namespace std; //定义枚举类型 typedef enu…

github删除自己的仓库

测试Github的时候新建了很多仓库&#xff0c;但是后来想删除&#xff0c;找了半天居然没有找到按钮。 我就推测这个删除的功能肯定藏起来了&#xff0c;后来度娘了一下&#xff0c;发现果然在一个比较隐蔽的位置&#xff0c;不知道以后这个功能会不会改到一个比较明显的位置吧…

驱动开发-字符设备驱动的注册与注销

1.注册字符设备驱动 #include<fs.h> int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops) 函数功能&#xff1a;注册字符设备驱动 参数&#xff1a;major&#xff1a;主设备号 major>0:静态指定主设备号&#xff0c;不…

uni-appH5Android混合开发二 || 使用Android Studio打包应用APK

前言&#xff1a; 在上一章节我们已经讲了如何uni-app离线打包Android平台教程&#xff0c;这一章就该来讲讲如何使用Android Studio打包应用APK提供给Android手机安装使用了。 uni-app跨平台框架介绍和快速入门 uni-app跨平台框架介绍和快速入门 第一步、首先打开已经编译好的…

vue cmd执行报错 ‘vue‘ 不是内部或外部命令

使用vue脚手架快速搭建项目&#xff0c;在cmd中执行&#xff1a;vue init webpack vue-demo&#xff0c;报错&#xff1a; vue 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决方法&#xff0c;执行如下的命令 npm config list 注意&#xff1a;找到prefix等号后…

[windows系统安装/重装系统][step-3]装驱动、打驱动、系统激活

重装系统三部曲 [windows系统安装/重装系统][step-1]U盘启动盘制作&#xff0c;微软官方纯净系统镜像下载-CSDN博客 [windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]-CSDN博客 [windows系统安装/重装系统][step-3]装驱动…

Navicat 17 的数据分析

上周的博客预告了 Navicat 17&#xff08;英文版&#xff09;即将发布&#xff0c;目前正在测试阶段&#xff0c;并计划于 5 月 13 日发布。如我们所见&#xff0c;版本 17 推出了众多令人兴奋的新功能。其中最大亮点是数据分析工具&#xff0c;只需点击按钮&#xff0c;即可为…

链表详解—单链表与双向链表

一.单链表 1.链表的概念及结构 (1)概念&#xff1a; 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 (2)结构&#xff1a; 与顺序表不同的是&#xff0c;链表里的每个节点都是独立申请的空…

02c++模板部分讲解

1理解函数模板 #include<iostream> using namespace std;//函数模板 template<typename T> //定义一个模板参数列表 //模板类型参数 typename/class bool compare(T a, T b) {cout << "template compare: " << endl;return a > b; }temp…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

Blazor入门-基础知识+vs2022自带例程的理解

参考&#xff1a; Blazor 教程 - 生成首个应用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基础知识&#xff1a;Visual Studio 2022 中的Blazor开发入门_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

【Unity自制手册】unity常用API大全——一篇文章足以(十万字详解)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 unity 实战系列 ⭐相关文章⭐ ⭐【软件设计师高频考点暴击】 -本站最全-unity常用API大全&#xff08;万字…

性能测试 --概念

什么是性能测试 性能测试和功能测试都是在系统测试阶段运行, 两者有什么区别呢? 案例:豌豆射手和三线射手都是射手, 它们的功能都是向前发射豌豆进行攻击, 能够攻击到地面的僵尸. 但是从性能上来讲, 豌豆射手只能攻击到一路的僵尸, 而三线射手能同时攻击三路(注:放在边路实际…

如何统计区域内部公路总长度和绘制数据直方图

交通对区域经济发展具有重要的意义&#xff0c;诸多经济学文献均对此进行了深入探讨&#xff0c;那么如何在ArcGIS上统计区域内部交通路线的总长度呢&#xff1f;本文以全国各省份主要公路总长度为例详细介绍了相关ArcGIS以及统计直方图的操作。 工具&#xff1a; 使用ArcGIS中…

【JavaScript】内置对象 - 数组对象 ③ ( 数组反转 - reverse 方法 | 数组排序 - sort 方法 | 自定义数组排序规则 )

文章目录 一、数组排序1、翻转数组元素 - reverse()2、数组元素排序 - sort() 默认从小到大排序3、数组元素排序 - sort() 自定义排序规则4、数组元素排序 - sort() 自定义降序排序简化写法 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript…

C#编程模式之享元模式

创作背景&#xff1a;各位朋友&#xff0c;我们继续学习C#的编程模式&#xff0c;本文主要介绍享元模式。享元模式是一种结构型设计模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;从而提高程序性能。它通过共享对象的方式来减少内存的使用&#xff0c;特别是系统中…