web编程

web编程基础

web的工作方式

Go语言(十二)web编程_第1张图片

http协议介绍

  • http请求体
    Go语言(十二)web编程_第2张图片
  • http响应体
    Go语言(十二)web编程_第3张图片

Web程序开发

  • 基于“net/http”封装的web服务相关的功能
  • 使用简单
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



    
    Login


用户名:
密码:
  • AuthFunc.go
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
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


    
    Login


用户名:{{ .Name }}
年龄:{{ .Age }}

if判断

  • index.html
用户名:{{ .Name }}
年龄:{{ .Age }}
{{ if gt .Age 18 }}

Hello old man

{{ else }}

hello young man

{{ end }}

with用法

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

  • index.html

用户名:{{ .Name }}
年龄:{{ .Age }}
{{with .Address}}
省:{{.Province}}
城市:{{.City}}
邮编:{{.Code}}
{{end}}
  • server.go
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

{{range .}}
用户名:{{ .Name }}
年龄:{{ .Age }}
{{with .Address}}
省:{{.Province}}
城市:{{.City}}
邮编:{{.Code}}

{{end}} {{end}}
  • server.go
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
   }
}