1. 程式人生 > >GO http

GO http

go 語言的http 包可以很方便的構建一個簡單的http server

下面我們通過程式碼來熟悉go 的http 包

package growth

import (
    "net/http"
    "log"
    "fmt"
)
// golang 第九天 學習 go web 程式設計

// 簡單的go web server 可以通過net/http 包來實現

func Day09WebDemo()  {
    // 設定路由
    http.HandleFunc("/", helloWorldPage)
    // http server 監聽埠
    err := http.ListenAndServe
(":9000", nil) if err != nil { log.Fatal(err) } } func helloWorldPage(w http.ResponseWriter, r *http.Request) { r.ParseForm() // 解析表單 fmt.Println("請求的url", r.URL.Path) fmt.Println("請求的表單", r.Form) fmt.Println("請求的方法", r.Method) fmt.Println("請求地址", r.Host) fmt.Println
("客戶端地址", r.RemoteAddr) for k, v := range r.Form{ fmt.Println(k) fmt.Println(v) } fmt.Fprint(w, "Hello World") }

上面的例子使用http.HandleFunc(), 指定了url 地址和 url 繫結的函式,使用http.ListenAndServe 指定了監聽的埠, 我們將請求到 / 這個地址的繫結到了函式 helloWorldPage(), 需要注意的是,使用HandleFunc 繫結到的函式 必須要接收兩個引數 http.ResponseWriter 和 http.Request, 我們通過 第二個引數 http.Request 就可以獲取到各種請求的資訊, 通過 http.ResponseWriter 給客戶端響應

http處理表單資料

通過前面的例子我們知道了通過http.Request 可以獲取到各種請求的資訊,那當然也可以獲取到使用者POST的資料, 下面我們通過程式碼來學習獲取表單的資料

func Day10WebForm()  {
    log.Println("Day10WebForm start")
    // 將 /login 請求交給login 函式處理 
    http.HandleFunc("/login", login)
    err := http.ListenAndServe(":8181", nil)
    if err != nil {
        fmt.Println("Startup Error, ", err)
    }
}

// login ==================================================================

func login(w http.ResponseWriter, r *http.Request)  {
    r.ParseForm() // 不執行這個 ParseForm 無法獲取到表單資料
    fmt.Println("Web Form: ", r.Form)
    // method := r.Method
    if len(r.Form) == 0 {
        log.Println("Form Cannot Be Empty")
    }

    username := r.FormValue("username")
    passwd := r.FormValue("password")

    if username != "beer" {
        fmt.Fprintln(w, "username Error")
    }

    if passwd != "123456" {
        fmt.Fprintln(w, "password Error")
    }

    log.Println("login success!")
    fmt.Fprintln(w, "200 OK")

}

這裡我們通過FormValue的方法拿到表單的資料

http 處理檔案上傳

處理檔案上傳的思路就是拿到使用者上傳的檔案,這裡不再使用FormValue了 而是使用FormFile的方法,然後拿到檔案的元資料,再寫入檔案即可

下面是檔案上傳的服務端demo 和 客戶端的html 程式碼

服務端處理檔案程式碼

package growth

import (
    "net/http"
    "fmt"
    "os"
    "io"
)
// golang 第十一天 學習 go web 程式設計 處理檔案上傳

func UploadHandler(w http.ResponseWriter, r *http.Request)  {
    // 處理檔案上傳
    method := r.Method

    if method == "POST" {
        /*
        處理檔案上傳我們需要呼叫r.ParseMultipartForm,裡面的引數表示maxMemory,呼叫ParseMultipartForm之後,
        上傳的檔案儲存在maxMemory大小的記憶體裡面,如果檔案大小超過了maxMemory,那麼剩下的部分將儲存在系統的臨時檔案中。
        我們可以通過r.FormFile獲取上面的檔案控制代碼

         */
        r.ParseMultipartForm(4096)

        file, handler, err := r.FormFile("upload")

        if err != nil {
            fmt.Println("FormFile Error", err)
        }
        fmt.Println("正在上傳", handler.Filename)
        defer file.Close()
        // 服務端開啟一個檔案 以便將客戶端上傳的檔案寫入到該檔案
        fd, e := os.OpenFile("./" + handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)

        if e != nil {
            fmt.Println("Write File Error")
        }
        // 寫入檔案
        io.Copy(fd, file)
        defer fd.Close()
        fmt.Fprintln(w, "200 OK Upload success! ", handler.Filename)

    }

}

func Day11WebUploadFile()  {

    http.HandleFunc("/upload", UploadHandler)

    err := http.ListenAndServe(":8182", nil)

    if err != nil {
        fmt.Println("檔案上傳失敗", err)
    }

}

客戶端html 上傳檔案

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上傳</title>
</head>
<body>
<form enctype="multipart/form-data" action="http://127.0.0.1:8182/upload" method="post">
    <input type="file" name="upload" />
    <input type="submit" value="上傳" />
</form>
</body>
</html>