go实现生成html文件和html文件浏览服务

文章目录


本文章是为了解决 使用Jenkins执行TestNg+Selenium+Jsoup自动化测试和生成ExtentReport测试报告生成的测试报告,只能在jenkins里面访问,为了方便项目组内所有人员都能查看测试报,可以在jenkins构建时,把测试报告的html推送到其它http服务,再让该http服务提供访问。
为了实现上边的功能,需要编写两个HTTP接口:

  • 1、upload接口,接收发送的html内容,并保存到硬盘中。
  • 2、view接口,提供浏览html文件服务。

本文使用Go的Gin框架实现上述功能,

package mainimport ("bufio""crypto/md5""encoding/hex""encoding/json""github.com/gin-gonic/gin"uuid "github.com/satori/go.uuid""io""log""net/http""os""strings""time"
)type WebData struct {Content string `json:"content"`//Token   string `json:"token_key"`
}
type ViewData struct {Date string `uri:"date" binding:"required"`Hour string `uri:"hour" binding:"required"`Path string `uri:"path" binding:"required"`
}func readString(name string) string {file, err := os.Open(name)if err != nil {panic(err)}var content = ""r := bufio.NewReader(file)for {line, err := r.ReadString('\n')if err != nil && err != io.EOF {panic(err)}line = strings.TrimSpace(line)content += lineif err == io.EOF {break}content += "\n"}file.Close()return content
}
func writeString(name string, content string) int {file, err := os.Create(name)if err != nil {panic(err)}w := bufio.NewWriter(file)len, err2 := w.WriteString(content)if err2 == nil {w.Flush()}file.Close()return len
}/*
*
本文不使用
*/
func md5Str(str string) (encode string) {md5 := md5.New()md5.Write([]byte(str))return hex.EncodeToString(md5.Sum(nil))
}
func upload(c *gin.Context) {result := gin.H{"url": "",}data := WebData{}requestBody, err := c.GetRawData()if err == nil {err2 := json.Unmarshal(requestBody, &data)if err2 == nil {date := time.Now().Format("20060102/15/")log.Printf("date====%v", date)u1 := uuid.NewV4()log.Printf("uuid====%v", u1.String())path := "temp/" + datefile := u1.String() + ".html"name := path + filelog.Printf("path====%v", name)_, err := os.Stat(path)if err != nil || os.IsNotExist(err) {os.MkdirAll(path, 0755)}content := data.Contentlen := writeString(name, content)log.Printf("writeString====%v", len)result["url"] = server + "/view/" + date + file} else {log.Println(err2)}}c.JSON(http.StatusOK, gin.H{"data": result,})
}
func view(c *gin.Context) {var viewData ViewDataif err := c.ShouldBindUri(&viewData); err != nil {c.String(400, err.Error())return}log.Printf("===date:%v,hour:%v,path:%v", viewData.Date, viewData.Hour, viewData.Path)name := "temp/" + viewData.Date + "/" + viewData.Hour + "/" + viewData.Pathc.Header("Content-Type", "text/html;charset=utf-8")conetnt := readString(name)log.Printf("view =====content:%v", conetnt)c.String(http.StatusOK, conetnt)
}const server string = "http://localhost:8080/html"func main() {router := gin.Default()router.Static("/temp", "./temp")v1 := router.Group("/html"){v1.POST("/upload", upload)v1.GET("/view/:date/:hour/:path", view)}// 监听并在 0.0.0.0:8080 上启动服务router.Run(":8080")
}

后期优化可以添加安全验证功能。

运行效果
访问upload接口,
在这里插入图片描述

通过view接口访问页面
在这里插入图片描述

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

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

相关文章

java stream简介

(1)Stream Stream(流)是一个来自数据源的元素队列并支持聚合操作。 forEach方法用来迭代流中的每个数据,没有返回值。map方法用于映射每个元素到对应的结果,有返回值,返回的是一个新流&#xf…

GraphicsMagick 的 OpenCL 开发记录(二十四)

文章目录 关于clGetPlatformIDs()在windows下的怪现象 <2022-04-18 周一> 关于clGetPlatformIDs()在windows下的怪现象 我在调查R6025的问题&#xff0c;调试发现LoadOpenCLDevices()函数中&#xff1a; number_platforms0; if (openCL_library->clGetPlatformIDs(…

Leetcode—114. 二叉树展开为链表【中等】

2023每日刷题&#xff08;九十八&#xff09; Leetcode—114. 二叉树展开为链表 Morris-like算法思想 可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题中序遍历的 Morris 算法有些神似&#xff0c;我们需要两步完成这道题。 将左子树插入到右子树的地方将原来的右…

PreNorm和PostNorm对比

要点总结 标准的Transformer使用的是PostNorm 在完全相同的训练设置下Pre Norm的效果要优于Post Norm&#xff0c;这只能显示出Pre Norm更容易训练&#xff0c;因为Post Norm要达到自己的最优效果&#xff0c;不能用跟Pre Norm一样的训练配置&#xff08;比如Pre Norm可以不加…

第14次修改了可删除可持久保存的前端html备忘录:增加一个翻牌钟,修改背景主题:现代深色

第14次修改了可删除可持久保存的前端html备忘录&#xff1a;增加一个翻牌钟&#xff0c;修改背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X…

关于SQLite 的下载与使用。配合python

win系统下&#xff1a; SQLite Download Page Precompiled Binaries for Windows sqlite-tools-win-x64-3450000.zip (4.77 MiB) 解压后&#xff0c;找个位置。然后设置环境变量指定位置。 可以手动建立.db文件。 也可以通过代码建立&#xff1a; 如下代码就是建立一个db文件。…

大语言模型-大模型基础文献

大模型基础 1、Attention Is All You Need https://arxiv.org/abs/1706.03762 attention is all you need 2、Sequence to Sequence Learning with Neural Networks https://arxiv.org/abs/1409.3215 基于深度神经网络&#xff08;DNN&#xff09;的序列到序列学习方法 3、…

网络安全防御保护实验(二)

一、登录进防火墙的web控制页面进行配置安全策略 登录到Web控制页面&#xff1a; 打开Web浏览器&#xff0c;输入防火墙的IP地址或主机名&#xff0c;然后使用正确的用户名和密码登录到防火墙的Web管理界面。通常&#xff0c;这些信息在防火墙设备的文档或设备上会有说明。 导…

鸿蒙ArkUI开发-应用添加弹窗

在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须关注的…

C++知识点笔记

二维数组 定义方式&#xff1a; 1、数据类型 数组名[行数][列数]; 2、数据类型 数组名[行数][列数]{{数据1,数据2},{数据3,数据4}}; 3、数据类型 数组名[行数][列数]{数据1,数据2,数据3,数据4}; 4、数据类型 数组名[][列数]{数据1,数据2,数据3,数据4}; 建议&#xff1a;以…

React中使用LazyBuilder实现页面懒加载方法二

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

springboot 优雅使用函数式编程处理 websocket @OnMessage 消息

背景 现在大多业务功能使用 socket.io实现长连接&#xff0c;但是部分第三方设备对接 只支持基础的websocket。 spring中使用基础的websocket, OnMessage 收到消息&#xff0c;对消息的处理&#xff0c;if else 将会繁琐&#xff0c;难以维护。 本文仅介绍了如何使用enum枚举、…

yarn的安装

下载node.js&#xff0c;使用npm安装 #先加载本地安装 yarn install --offline//安装 npm install -g yarn yarn --version //查看版本 npm install -g yarn //安装安装node.js,下载yarn的安装程序: Yarn 淘宝源安装&#xff0c;分别复制粘贴以下代码行到黑窗口运行即可 …

考研机试 谁是你潜在的朋友

描述 “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男&#xff0c;你发现自己与他人相互了解的机会并不太多。幸运的是&#xff0c;你意外得到了一份北大图书馆的图书借阅记录&#xff0c;于是你挑灯熬夜地…

Selenium wait element点击

场景&#xff1a;input单元格输入mail格式的字符串&#xff08;会进行字符串mail格式的校验&#xff09;&#xff0c;很快下方的button<next>才变绿可点击。 隐式等待&#xff1a;implicitly_wait method1: 点不上&#xff0c;这里有个坑&#xff0c;下面2种方式不能同时…

插槽(64-67)

文章目录 插槽1.插槽 - 默认插槽(组件内可以定制一处结构)2.插槽 - 后备内容&#xff08;默认值&#xff09;3.插槽 - 具名插槽(组件内可以定制多处结构)4.作用域插槽(插槽的一个传参语法) 插槽 插槽分类:默认插槽和具名插槽 1.插槽 - 默认插槽(组件内可以定制一处结构) 作用…

qt学习:http+访问百度智能云api实现动物图片识别

目录 获取id key 编程步骤 配置ui界面 添加模块,头文件和定义变量 新建两个类,一个图像Image类,一个Http类,http类继承QObject类,并添加头文件并定义成员和函数 实现图像Image类,Http类的函数 在ui界面的cpp中添加全局变量,根据自己的应用来写,开头有获取方法

Java解决ReabbitMQ解决消息重复消费问题

RabbitMQ中解决消息重复消费的问题通常涉及到确保消息的幂等性和使用消息确认机制。以下是一些常见的解决方法&#xff1a; 消息去重&#xff1a;在消费者端实现消息的去重逻辑&#xff0c;例如使用数据库的唯一约束或者分布式锁来保证同一消息不会被处理多次。 消息确认&…

【投稿优惠|EI优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024)

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024) 2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024) 一、【会议简介】 随着全球能源需求的不断增长&#xff0c;清洁能源的研究与应用成为了国际…

【npm包】如何发布自己的npm包

随着Node.js的普及&#xff0c;npm&#xff08;Node Package Manager&#xff09;已成为JavaScript开发者中不可或缺的一部分。发布自己的npm包&#xff0c;不仅可以将自己的项目分享给更多人&#xff0c;还可以为社区做出贡献。本文将详细介绍如何从零开始发布自己的npm包。 …