Gin第六天---响应以及渲染

简介: Gin第六天---响应以及渲染

Gin第六天


1.数据响应


我们后端可以实现针对不同路由对应不同数据格式的响应,常用的是json格式,当然还有许多我们可以返回的数据格式,例如结构体、XML……


package main
import(
   "github.com/gin-gonic/gin"
   "github.com/gin-gonic/gin/testdata/protoexample"
)
func main(){
   r:=gin.Default()
   // JSON格式
   r.GET("/JSON", func(c *gin.Context) {
      c.JSON(200,gin.H{"message":"someJSON","status":200})
   })
   // 结构体格式
   r.GET("/Struct", func(c *gin.Context) {
      var msg struct{
         Name string
         Message string
         Number int
      }
      msg.Name="test"
      msg.Message="message"
      msg.Number=123
      c.JSON(200,msg)
   })
   // XML
   r.GET("/XML", func(c *gin.Context) {
      c.XML(200,gin.H{"message":"abc"})
   })
   // YAML
   r.GET("/YAML", func(c *gin.Context) {
      c.YAML(200,gin.H{"name":"test"})
   })
   // protobuf
   r.GET("/Protobuf", func(c *gin.Context) {
      resp:=[]int64{int64(10),int64(2)}
      label:="label"
      data:=&protoexample.Test{
         Label: &label,
         Reps: resp,
      }
      c.ProtoBuf(200,data)
   })
   r.Run(":8888")
}
复制代码


Gin中已经将常用的数据格式类型封装好了,只需要按要求将想要返回的数据格式内容写好


2. 模板渲染


这个是几乎所有web框架离不开的一个功能,也是现在很少用到的功能。为什么这么说呢,我学习了很多种web开发的框架,几乎都涉及到了html的模板渲染(模版引擎),像python里面的jinja2、springboot中的thymeleaf以及gin的LoadHTMLFiles()。但是实际开发中大多选择前后端分离,很少在用模板渲染。所以这里只是简单示范


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
)
func main(){
   r:=gin.Default()
   r.LoadHTMLGlob("static/*")
   r.GET("/index", func(c *gin.Context) {
      c.HTML(http.StatusOK,"index.html",gin.H{"title":"我是测试","ce":"123456"})
   })
   r.Run()
}
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.title}}</title>
</head>
<body>
asdfjdsjklfsdlkfj{{.ce}}
</body>
</html>
复制代码


image.png


{{}}中就可以将路由参数作为变量传入前端页面进行渲染


3.重定向


重定向应该也是web开发中比较常用到的一个功能,前端经常可以写a标签点击跳转,后端如果想要将访问的路由修改到新的路由,也需要使用重定向。假如我们想将自己的web应用首页设置为百度,就可以像下面这样重定向到百度首页


package main
import (
   "github.com/gin-gonic/gin"
   "net/http"
)
func main(){
   r:=gin.Default()
   r.GET("/index", func(c *gin.Context) {
      c.Redirect(http.StatusMovedPermanently,"https://www.baidu.com")
   })
   r.Run()
}
复制代码


image.png


返回的是301,也就是永久重定向。这里稍微提一下,响应码302对应临时重定向,二者的区别在于永久重定向代表浏览器缓存了这个重定向的关联,下次请求相同路由的时候会直接发送重定向后的路由请求。这也就是为什么很多时候明明修改了重定向的路由,但是浏览器打开显示的还是之前的重定向页面。解决这个问题很简单,可以更换一种浏览器打开,或者清除浏览器缓存。


4. 同步与异步


众所周知,Go受欢迎一个主要原因就是与生俱来的并发优势,在很多时候go对于异步处理会比其他语言简单很多。对于I/O密集型的任务,使用多线程可以大大提高CPU使用率。在go语言中,我们只需要一个go关键字,就可以将函数变为异步执行,但是注意在使用新的goroutine时我们不应该使用原始的上下文,而是应该使用它的副本。同时要注意多线程之间的并发安全问题。


package main
import (
   "github.com/gin-gonic/gin"
   "log"
   "time"
)
func main(){
   r:=gin.Default()
   r.GET("/async", func(c *gin.Context) {
      copyContext:=c.Copy()
      go func(){
         time.Sleep(3*time.Second)
         log.Println("异步执行:"+copyContext.Request.URL.Path)
      }()
   })
   r.GET("/sync", func(c *gin.Context) {
      time.Sleep(3*time.Second)
      log.Println("同步执行:"+c.Request.URL.Path)
   })
   r.Run()
}
复制代码

image.png

这样就对比了同步和异步执行的响应时间,可以看到差距还是比较明显的。


结尾


最近除了Gin,也在看python的fastapi,同样是异步支持框架,感觉写法上和flask很相似,所以学习成本不会太高,主要就是异步编码时async/await的使用,而且目前貌似fastapi社区中关于异步支持的插件并不是特别多,而且官方文档有的地方中文版都没有翻译完,很多时候看原版文档有些词不翻译还是不好理解。最后慢慢也要把Vue2收尾,再慢慢转向Vue3,争取假期还是能学完一点东西的。

目录
相关文章
|
1月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
50 2
|
1月前
|
前端开发 网络协议
Nest.js 实战 (十四):如何获取客户端真实 IP
这篇文章介绍了在Nest.js应用中获取客户端真实IP地址的问题及解决方法。问题出现在使用本地代理时,请求的IP地址总是返回::1或::ffff:127.0.0.1。为解决这个问题,需要确保代理服务器正确设置转发头如X-Forwarded-For或X-Real-IP,后端服务能够读取这些头信息来确定客户端的IP地址。文章以作者自己的OpenResty应用为例,展示了如何通过配置反向代理和设置X-Forwarded-For头来获取真实IP地址,并提供了相关的代码示例。最后,文章提到了使用这个解决方案后的实际效果,例如在操作日志中记录真实IP地址。
|
5月前
|
XML 存储 JSON
gin框架学习笔记(二) ——相关数据与文件的响应
gin框架学习笔记(二) ——相关数据与文件的响应
|
6月前
|
JSON 数据处理 数据库
Flask视图函数与响应处理的艺术
【4月更文挑战第15天】本文探讨了Flask框架中视图函数和响应处理的原理与实践。视图函数通过`@app.route()`装饰器与URL关联,处理用户请求并返回响应。示例展示了如何从URL或请求对象获取参数,以及执行不同操作后返回响应。Flask支持字符串、元组和响应对象等多种响应类型。最佳实践包括保持视图函数简洁、使用模板引擎、处理异常和设置正确状态码。掌握这些技能能提升Web应用的用户体验和开发效率。
|
XML JSON Go
Gin 学习之响应处理
Gin 学习之响应处理
64 0
|
前端开发
前端学习笔记202307学习笔记第六十天-axios请求响应结果的结构1
前端学习笔记202307学习笔记第六十天-axios请求响应结果的结构1
40 0
|
JSON 前端开发 数据格式
【Django学习】(十一)APIView_请求与响应_GenericAPIView
【Django学习】(十一)APIView_请求与响应_GenericAPIView
|
前端开发 数据格式
#yyds干货盘点 【React工作记录三十七】react常见的http网络请求
#yyds干货盘点 【React工作记录三十七】react常见的http网络请求
67 0
|
前端开发
前端学习案例6-ajax中得状态
前端学习案例6-ajax中得状态
52 0
前端学习案例6-ajax中得状态
|
Python
请求方式之二----requests模块
请求方式之二----requests模块
75 0