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

news2024/11/25 3:03:04

前言

在看是今天的内容之前,我们收先来探究一下:什么是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 路径和目录路径。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解C#中的IO操作:Path类的详解

文章目录 前言一、Path类的概述二、Path类的主要方法2.1 Path.GetFullPath(string relativePath)2.2 Path.GetDirectoryName(string path)2.3 Path.GetFileName(string path)2.4 Path.GetFileNameWithoutExtension(string path)2.5 Path.GetExtension(string path)2.6 Path.Com…

号外!IP SSL证书申请只需十分钟!

IP SSL证书是一种专为IP地址设计的SSL证书&#xff0c;它使得基于IP地址的网站或服务能够实现HTTPS加密&#xff0c;确保数据在传输过程中的安全性和完整性。以下是关于IP SSL证书的一些技术性要点和申请流程概述&#xff1a; 一、IP SSL证书技术要点 1、适用场景&#xff1a…

spring cloud微服务example 入门第一个例子

新建Maven工程 删除src目录&#xff0c;修改poml.xml <modelVersion>4.0.0</modelVersion><groupId>org.example</groupId> <artifactId>SpringCloud_example</artifactId> <version>1.0-SNAPSHOT</version> <packaging&g…

24年湖南三支一扶报名详细流程(电脑报名)

24年湖南三支一扶报名详细流程&#xff08;电脑报名&#xff09; #湖南三支一扶 #湖南三支一扶考试 #三支一扶报名照片 #三支一扶考试 #三支一扶 #湖南省三支一扶

【AI大模型应用开发】LATS:比ToT和ReAct更强大的大模型思维框架

大家好&#xff0c;我是 同学小张&#xff0c;持续学习C进阶知识和AI大模型应用实战案例&#xff0c;持续分享&#xff0c;欢迎大家点赞关注&#xff0c;共同学习和进步。 我们在大模型中常听说CoT&#xff08;思维链&#xff09;、ToT&#xff08;思维树&#xff09;&#xff…

AI视频教程下载:基于OpenAl、LangChain、 Replicate开发AI应用程序

欢迎来到令人兴奋的 AI 应用世界&#xff01;在这门课程中&#xff0c;你将学习到创建一个能够与用户互动、理解自然语言、处理音频输入&#xff0c;甚至分析图像的真正智能应用所需的技能和技术。 AI 工具和技术 你将获得使用几个知名 AI API 和技术的实际经验。这些行业领先…

【数据结构】栈和队列OJ面试题

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;由于C语言没有栈的接口&#xff0c;所以我们需要自己造一个“模子”。我们直接copy之前的实现的栈的接口就可以了&#xff08;可以看我之前的博客【数据结构】栈和队列-CSDN博客copy接口&#xff09;&…

VTK图形算法API:vtkSphereSource,球几何数据

大家好&#xff0c;我是先锋&#xff0c;专注于AI领域和编程技术分享&#xff0c;在这里定期分享计算机编程知识&#xff0c;AI应用知识&#xff0c;职场经验&#xff1b; 本系列介绍VTK图像算法API&#xff0c;后续会介绍VTK项目实践应用&#xff0c;关注我&#xff0c;不错过…

开源aodh学习小结

1 介绍 aodh是openstack监控服务&#xff08;Telemetry&#xff09;下的一个模块&#xff0c;telemetry下还有一个模块ceilometer OpenStack Docs: 2024.1 Administrator Guides Get Started on the Open Source Cloud Platform - OpenStack Telemetry - OpenStack 1.1 代码仓…

01-02-3

1、线性表 a.定义&#xff1a; 有n&#xff08;n>0&#xff09;个相同类型的元素组成的有序集合。 数组是线性表的一种。通常用数组实现。 b.线性表的顺序存储 b-1&#xff1a;顺序表结构体的定义 顺序表是一个结构体变量。结构体内部有两个数据&#xff1a;一个用于存…

Nature 综述(IF=88):微生物群落和土壤性质之间的相互作用

随着社会的发展&#xff0c;环境污染和自然资源的消耗日益严重&#xff0c;土壤生态系统的健康状况备受关注。然而&#xff0c;当前研究领域存在一个问题&#xff0c;即在研究土壤微生物群落结构的同时&#xff0c;忽略了微生物对土壤环境的影响。本文旨在探讨微生物如何通过生…

牛客热题:旋转数组的最小数字

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;旋转数组的最小数字题目链接方法…

二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序 1.二叉树的前序遍历 题目&#xff1a; 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性&#xff0c;方法&#xff0c;访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…

通过GRE隧道实现OSPF、BGP、IS-IS的套接使用

正文共&#xff1a;999 字 9 图&#xff0c;预估阅读时间&#xff1a;1 分钟 书接上文&#xff08;专线入云场景能否配置动态路由协议&#xff1f;&#xff09;&#xff0c;我们发现通过一定的配置&#xff0c;具体就是组合使用IBGP和静态路由&#xff0c;在使用云专线接入到资…

科技查新中的工法查新点如何确立与提炼?案例讲解!

按《工程建设工法管理办法》( 建 质&#xff3b;2014&#xff3d;103 号) &#xff0c;工法&#xff0c;是指以工程为对象&#xff0c;以工艺为核心&#xff0c;运用系 统工程原理&#xff0c;把先进技术和科学管理结合起来&#xff0c;经过一定工程实践形成的综合配套的施工方…

【go项目01_学习记录11】

操作数据库 1 文章列表2 删除文章 1 文章列表 &#xff08;1&#xff09;先保证文章已经有多篇&#xff0c;可以直接在数据库中添加&#xff0c;或者访问链接: localhost:3000/articles/create&#xff0c;增加几篇文章。 &#xff08;2&#xff09;之前设置好了articles.ind…

移动端自动化测试工具 Appium 之自定义报告

文章目录 一、背景二、具体实现1、保存结果实体2、工具类3、自定义报告监听类代码4、模板代码4.1、report.vm4.2、执行xml 三、总结 一、背景 自动化测试用例跑完后报告展示是体现咱们价值的一个地方咱们先看原始报告。 上面报告虽然麻雀虽小但五脏俱全&#xff0c;但是如果用…