go web学习笔记
- 基于Go的简单web应用
- 应用的多数据源访问
- 模拟表单上传
- 解析JSON格式的HTTP请求响应
访问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)
}
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
}

浙公网安备 33010602011771号