1. 程式人生 > >golang的http實現case

golang的http實現case

golang web初步理解與思考

golang的收穫

  • 這裡可以獲知,可以實現一個簡單的web頁面來展示後臺的資料,這裡的資料是 111111 資料遞增200, 222222資料遞增10;
    • 資料的web展示, 展示的效果看html+css的樣式過程
    • 可以進行post,提交前臺的一些資料,這些資料可以修改為後臺的引數
  • 通過 http.HandleFunc("/test1", SimpleServer1), 前面是url,後面是實現的函式, 實現的函式可以初步看成是資料處理;
  • go html template,對html的格式進行解析, 對常用的資料進行存放;

案例分析

  • http存在路由的說法, 其實可否理解為 http://ip:port/test2
  • http可以實現後臺資料到前臺的展示,雖然顯示的有些簡單,但結論可以定義為是css+icon的樣子了;(需要分析一些html的格式)
  • golang中定義template.New("webpage").Parse(tpl), 其中tpl定義form的格式,裡面重點是:
    • {{range .Items}}<div>{{ . }}</div>{{else}}
  • 在html中定義action, #, method, post; get 相關的方法需要實現;

package main

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

const form = `
    <html>
    <head>
      <style>
      table, th, td {
        border: 1px solid green;
      </style>
    </head>
    <body>
        <form action="#" method="post" name="bar">
            <input type="text" name="in" />
            <input type="submit" value="submit"/>
        </form>
    </body>
    
    </html>
`

const tpl = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{{.Title}}</title>
        <style>    
            table, th, td {
            border: 1px solid green;
        </style>
        <script language="JavaScript">
        function myrefresh()
        {
            window.location.reload();
        }
        setTimeout('myrefresh()',5000); //指定5秒重新整理一次
        </script>
    </head>
    <body>
        
        <div><strong>no rows</strong></div>{{end}}
        <table>
        {{range .Items}}<div>{{ . }}</div>{{else}}
        <tr><th>Inst</th><th>count</th><th>rate</th><th>flag</th></tr>
        <tr><td>hello</td><td>200</td><td>70</td><td>true</td></tr>
        </table>
        <!-- 在這裡定義表格,然後顯示出機構成功率的狀態 -->
    </body>
</html>`

type Inst struct {
    name string
    cnt  int
    rate int
    flag bool
}

type InstRate struct {
    Title string
    Items [5]Inst
}

var data InstRate
var i int
var t *template.Template

func init() {
    t, _ = template.New("webpage").Parse(tpl)
    data.Title = "Hello world"
    // check(err)
}

func check(err error) {
    if err != nil {
        fmt.Println(err)
    }
}
func SimpleServer1(w http.ResponseWriter, request *http.Request) {

    fmt.Println("SimpleServer1 start", time.Now())

    i++

    data.Items[0].name = "111111"
    data.Items[0].cnt = 200 + i*200
    data.Items[0].rate = 70
    data.Items[0].flag = true

    data.Items[1].name = "222222"
    data.Items[1].cnt = 500 + i*10
    data.Items[1].rate = 80
    data.Items[1].flag = true
    //  time.Sleep(time.Second * 5)

    fmt.Println("SimpleServer1 end", time.Now())

    err := t.Execute(w, data)
    check(err)
}

/* handle a simple get request */
func SimpleServer(w http.ResponseWriter, request *http.Request) {

    check := func(err error) {
        if err != nil {
            fmt.Println(err)
        }
    }

    t, err := template.New("webpage").Parse(tpl)
    check(err)

    data := struct { // 這裡可以定義機構資料, 然後迴圈顯示出機構的狀態;
        Title string
        Items []string
    }{
        Title: "機構成功率",
        Items: []string{
            "222222",
            "111111",
        },
    }

    fmt.Println(data)

    err = t.Execute(w, data)
    check(err)

}

func FormServer(w http.ResponseWriter, request *http.Request) {
    w.Header().Set("Content-Type", "text/html")
    switch request.Method {
    case "GET":
        /* display the form to the user */
        io.WriteString(w, form)
    case "POST":
        /* handle the form data, note that ParseForm must
           be called before we can extract form data */
        //request.ParseForm();
        //io.WriteString(w, request.Form["in"][0])
        io.WriteString(w, request.FormValue("in"))
    }
}

func main() {
    http.HandleFunc("/test1", SimpleServer1)
    http.HandleFunc("/test2", FormServer)
    if err := http.ListenAndServe(":8088", nil); err != nil {
        panic(err)
    }
}