go web学习笔记

- 基于Go的简单web应用
- 应用的多数据源访问
- 模拟表单上传
- 解析JSON格式的HTTP请求响应

基于Go的简单web应用

访问localhost:9090/login可以打开一个登录页面,填入用户名和密码提交后可以在后台看到输出。
访问localhost:9090/upload可以打开一个文件上传页面,选择文件提交后可以在后台看到输出,同时在当前项目的test子目录下可以看到上传的文件。

package main

import (
	"fmt"
	"html/template"
	"net/http"
	"log"
	"io"
	"os"
)

func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println("method:", r.Method)
	if r.Method == "GET" {
		t, _ := template.ParseFiles("login.gtpl")
		log.Println(t.Execute(w, nil))
	} else {
		r.ParseForm()
		fmt.Println("username:", r.Form["username"])
		fmt.Println("password:", r.Form["password"])
        //此处可以做用户名和密码的验证
	}
}

func upload(w http.ResponseWriter, r *http.Request) {
	fmt.Println("method: ", r.Method)
	if r.Method == "GET" {
		t, _ := template.ParseFiles("upload.gtpl")
		t.Execute(w, nil)
	} else {
		r.ParseMultipartForm(32 << 20)
		file, handler, err := r.FormFile("uploadFile")
		if err != nil {
			fmt.Println(err)
			return
		}
		defer file.Close()
		fmt.Fprintf(w, "%v", handler.Header)
		f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
		if err != nil {
			fmt.Println(err)
			return
		}
		defer f.Close()
		io.Copy(f, file)
	}
}

func main() {
	http.HandleFunc("/login", login)
	http.HandleFunc("/upload", upload)
	err := http.ListenAndServe(":9090", nil)
	if err != nil {
		log.Fatal("ListenAndServer: ", err)
	}
}

多数据源访问

package main


func main()  {
	http.HandleFunc("/getAccessToken", controller.GetAccessToken)
	err := http.ListenAndServe(":9090", nil)
	if err != nil {
		log.Fatal("ListenAndServer: ", err)
	}
}

//注册数据库,此处以两个MySQL为例,也可以注册多种不同数据库
func init()  {
	orm.RegisterDriver("mysql", orm.DRMySQL)
	orm.RegisterDataBase("default", "mysql", "账号:密码@tcp(数据库1地址)/hdfs?charset=utf8")
	orm.RegisterDataBase("db2", "mysql", "账号:密码@tcp(数据库2地址)/tx_log_analysis_test?charset=utf8")
	orm.Debug = true
}

package model


type ResponseToken struct {
	Success bool
	Msg		string
	Token	string
}

type Tadmin struct {
	MailNum string `orm:"column(mailNum);PK"`
	UserName string `orm:"column(userName)"`
	UserDepart string `orm:"column(userDepart)"`
	Password string
	RoleName string
	CreateTime string `orm:"column(createTime)"`
	CreatedByWho string `orm:"column(createdByWho)"`
	UpdateTime string `orm:"column(updateTime)"`
	UpdatedByWho string `orm:"column(updatedByWho)"`
}

func init()  {
	orm.RegisterModel(new(Tadmin))
}

package controller


func GetAccessToken(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	emailnum := r.FormValue("emailnum")
	password := r.FormValue("password")
	result := model.ResponseToken{}
	if emailnum == "" || password == "" {
		result.Msg = "用户名或密码为空"
		result.Success = false
	} else {
		o := orm.NewOrm()
		//此处切换数据库
		o.Using("db2")
		user := model.Tadmin{MailNum: emailnum}
		err := o.Read(&user)
		if err != nil {
			fmt.Println(err)
		} else {
			passwordTrue := user.Password
			if passwordTrue == getPwd(password) {
				//此处密码判断通过,生成令牌
			} else {
				result.Msg = "密码错误"
				result.Success = false
			}
		}
	}
}

func encrypt(dataStr string) string {
	md5Ctx := md5.New()
	io.WriteString(md5Ctx, dataStr)
	cipherStr := md5Ctx.Sum(nil)
	return hex.EncodeToString(cipherStr)
}

func getPwd(password string) string {
	return encrypt(password + "混淆代码")
}

- 模拟表单上传

模拟本地文件上传,运行程序将项目目录下的Swagger2.docx上传到http://localhost:9090/upload

import (
	"bytes"
	"mime/multipart"
	"fmt"
	"os"
	"io"
	"net/http"
	"io/ioutil"
)

func postFile(filename string, targetUrl string) error {
	//打开一个Buffer,用于写入文件
	bodyBuf := &bytes.Buffer{}
	bodyWriter := multipart.NewWriter(bodyBuf)

	fileWriter, err := bodyWriter.CreateFormFile("uploadFile", filename)
	if err != nil {
		fmt.Println("写入缓存时发生错误")
		return err
	}

	//打开需要上传的文件
	fh, err := os.Open(filename)
	if err != nil {
		fmt.Println("打开文件时发生错误")
		return err
	}

	//将文件内容复制到缓存
	_, err = io.Copy(fileWriter, fh)
	if err != nil {
		return err
	}

	//提交表单(文件上传)
	contentType := bodyWriter.FormDataContentType()
	bodyWriter.Close()

	resp, err := http.Post(targetUrl, contentType, bodyBuf)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
    
	//读取响应
	resp_body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	fmt.Println(resp.Status)
	fmt.Println(string(resp_body))
	return nil
}

func main() {
	targetUrl := "http://localhost:9090/upload"
	filename := "Swagger2.docx"
	postFile(filename, targetUrl)
}

- 解析JSON格式的HTTP请求响应

func main() {
	tokenUrl := "http://10.2.8.136:19006/getAccessToken"
	var token = getToken(tokenUrl).AccessToken
	fmt.Println(token)
}

type Response struct {
	Success string
	AccessToken string `json:"access_token"`
	ErrorInfo string `json:"error_info"`
}

func getToken(tokenUrl string) Response {
	//请求数据,获得响应
	resp, err := http.Get(tokenUrl)
	if err != nil {
		fmt.Println(err)
	}
	
  //读取响应内容
	defer resp.Body.Close()
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
	}
    
  //将响应内容解析成实体
	var s Response
	json.Unmarshal([]byte(string(respBody)), &s)
	return s
}
posted @ 2021-11-12 12:34  leayun  阅读(86)  评论(0)    收藏  举报