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

文章目录


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

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

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

package main

import (
	"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 += line
		if 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/" + date
			file := u1.String() + ".html"
			name := path + file
			log.Printf("path====%v", name)
			_, err := os.Stat(path)
			if err != nil || os.IsNotExist(err) {
				os.MkdirAll(path, 0755)
			}
			content := data.Content
			len := 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 ViewData
	if 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.Path
	c.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接口,
go实现生成html文件和html文件浏览服务_第1张图片

通过view接口访问页面
go实现生成html文件和html文件浏览服务_第2张图片

你可能感兴趣的:(Go,golang,html,gin)