前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言(十二)web编程

Go语言(十二)web编程

作者头像
alexhuiwang
发布2020-09-24 16:46:56
1K0
发布2020-09-24 16:46:56
举报
文章被收录于专栏:运维博客运维博客

web编程

web编程基础

web的工作方式

Go语言(十二)web编程
Go语言(十二)web编程

http协议介绍

  • http请求体
Go语言(十二)web编程
Go语言(十二)web编程
  • http响应体
Go语言(十二)web编程
Go语言(十二)web编程

Web程序开发

  • 基于“net/http”封装的web服务相关的功能
  • 使用简单
代码语言:javascript
复制
func sayhelloName(w http.ResponseWriter,r *http.Request) {
   r.ParseForm()       //参数解析
   fmt.Printf("r.Form:%v\n",r.Form)    
   fmt.Printf("Path:%v\n",r.URL.Path)
   fmt.Printf("Schema:%v\n",r.URL.Scheme)
   fmt.Printf("r.Form[url_long]:%v\n",r.Form["url_long"])

   for k,v := range r.Form{
      fmt.Printf("key=%v\n",k)
      fmt.Printf("val=%v\n",strings.Join(v,""))
   }

   fmt.Fprintf(w,"hello")

}

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

golang web服务工作方式

表单提交

  • 通过<form></form>扩起来的区域,允许用户提交数据
  • 用户登录验证小例子
    • login.html
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<form action="/login" method="POST">
    <div>
        <span>用户名:</span>
        <input type="text" name="username">
    </div>
    <div>
        <span>密码:</span>
        <input type="text" name="password">
    </div>
    <div>
        <input type="submit" value="登录">
    </div>
</form>
</body>
</html>
  • AuthFunc.go
代码语言:javascript
复制
func loginFunc(w http.ResponseWriter,r *http.Request) {
   if r.Method == "GET" {
      data,err := ioutil.ReadFile("./login.html")
      if err != nil {
         http.Redirect(w,r,"/404.html",http.StatusNotFound)
         fmt.Errorf("read file faild:err:%v\n",err)
         return
      }
      w.Write(data)
   }else if r.Method == "POST" {
      r.ParseForm()
      username := r.FormValue("username")
      password := r.FormValue("password")
      if username == "admin" && password == "admin" {
         fmt.Fprintf(w,"login success")
      }else {
         fmt.Fprintf(w,"username or password error")
      }
   }
}

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

模板介绍与使用

模板替换

  • {{}}来包含需要在渲染时被替换的字段,{{.}}表示当前对象
通过{{.FieldName}} 来访问对象的属性
  • demo.go
代码语言:javascript
复制
var (
   t *template.Template
)

type User struct {
   Name string
   Age  int
}

func initTemplate() (err error){
   //加载模板
   t, err = template.ParseFiles("./index.html")
   if err != nil {
      fmt.Println("parse file error:",err)
      return
   }
   return
}

func handleUserInfo(w http.ResponseWriter,r *http.Request) {
   var user User = User{
      Name: "wanghui",
      Age:  20,
   }

   t.Execute(w,user)
}

func main() {
   err := initTemplate()
   if err != nil {
      return
   }

   http.HandleFunc("/user/info",handleUserInfo)
   err = http.ListenAndServe(":9090",nil)
   if err != nil {
      fmt.Errorf("http start error %v\n",err)
      return
   }
}
  • index.html
代码语言:javascript
复制
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<form action="/login" method="POST">
    <div>
        <span>用户名:{{ .Name }}</span>

    </div>
    <div>
        <span>年龄:{{ .Age }}</span>
    </div>
</form>
</body>
</html>
if判断
  • index.html
代码语言:javascript
复制
<div>
    <span>用户名:{{ .Name }}</span>
</div>
<div>
    <span>年龄:{{ .Age }}</span>
</div>
<div>
    {{ if gt .Age 18 }}
        <p>Hello old man</p>
        {{ else }}
        <p>hello young man</p>
    {{ end }}
</div>
with用法

为了简化结构体嵌套的问题

  • index.html
代码语言:javascript
复制
<body>
<form action="/login" method="POST">
    <div>
        <span>用户名:{{ .Name }}</span>
    </div>
    <div>
        <span>年龄:{{ .Age }}</span>
    </div>
    {{with .Address}}
    <div>
        <span>省:{{.Province}}</span>
    </div>
    <div>
        <span>城市:{{.City}}</span>
    </div>
    <div>
        <span>邮编:{{.Code}}</span>
    </div>
    {{end}}
</form>
</body>
  • server.go
代码语言:javascript
复制
var (
   t *template.Template
)

type Address struct {
   Province string
   City     string
   Code     string
}

type User struct {
   Name    string
   Age     int
   Address Address
}

func initTemplate() (err error){
   //加载模板
   t, err = template.ParseFiles("./index.html")
   if err != nil {
      fmt.Println("parse file error:",err)
      return
   }
   return
}

func handleUserInfo(w http.ResponseWriter,r *http.Request) {
   var user User = User{
      Name: "wanghui",
      Age:  20,
      Address:Address{
         Province: "gansu",
         City:     "zhangye",
         Code:     "734000",
      },
   }
   t.Execute(w,user)
}

func main() {
   err := initTemplate()
   if err != nil {
      return
   }

   http.HandleFunc("/user/info",handleUserInfo)
   err = http.ListenAndServe(":9090",nil)
   if err != nil {
      fmt.Errorf("http start error %v\n",err)
      return
   }
}
range循环语法
  • index.html
代码语言:javascript
复制
<body>
<form action="/login" method="POST">
    {{range .}}
    <div>
        <span>用户名:{{ .Name }}</span>
    </div>
    <div>
        <span>年龄:{{ .Age }}</span>
    </div>
    {{with .Address}}
        <div>
            <span>省:{{.Province}}</span>
        </div>
        <div>
            <span>城市:{{.City}}</span>
        </div>
        <div>
            <span>邮编:{{.Code}}</span>
        </div>
        <hr>
    {{end}}
    {{end}}
</form>
</body>
  • server.go
代码语言:javascript
复制
package main

import (
   "fmt"
   "html/template"
   "net/http"
)

var (
   t *template.Template
)

type Address struct {
   Province string
   City     string
   Code     string
}

type User struct {
   Name    string
   Age     int
   Address Address
}

func initTemplate() (err error) {
   //加载模板
   t, err = template.ParseFiles("./index.html")
   if err != nil {
      fmt.Println("parse file error:", err)
      return
   }
   return
}

func handleUserInfo(w http.ResponseWriter, r *http.Request) {
   var users []*User
   for i := 0; i < 15; i++ {
      var user User = User{
         Name: "wanghui",
         Age:  20,
         Address: Address{
            Province: "gansu",
            City:     "zhangye",
            Code:     "734000",
         },
      }
      users = append(users,&user)
   }

   t.Execute(w, users)
}

func main() {
   err := initTemplate()
   if err != nil {
      return
   }

   http.HandleFunc("/user/info", handleUserInfo)
   err = http.ListenAndServe(":9090", nil)
   if err != nil {
      fmt.Errorf("http start error %v\n", err)
      return
   }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • web编程
    • web编程基础
      • web的工作方式
      • http协议介绍
      • Web程序开发
      • golang web服务工作方式
    • 表单提交
      • 模板介绍与使用
        • 模板替换
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档