天天看點

Go基礎程式設計:HTTP程式設計

Go語言标準庫内建提供了net/http包,涵蓋了HTTP用戶端和服務端的具體實作。使用net/http包,我們可以很友善地編寫HTTP用戶端或服務端的程式。

1 HTTP服務端

示例代碼:

package main

import (
    "fmt"
    "net/http"
)

//服務端編寫的業務邏輯處理程式
//hander函數: 具有func(w http.ResponseWriter, r *http.Requests)簽名的函數
func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.RemoteAddr, "連接配接成功")  //r.RemoteAddr遠端網絡位址
    fmt.Println("method = ", r.Method) //請求方法
    fmt.Println("url = ", r.URL.Path)
    fmt.Println("header = ", r.Header)
    fmt.Println("body = ", r.Body)

    w.Write([]byte("hello go")) //給用戶端回複資料
}

func main() {
    http.HandleFunc("/go", myHandler)

    //該方法用于在指定的 TCP 網絡位址 addr 進行監聽,然後調用服務端處理程式來處理傳入的連接配接請求。
    //該方法有兩個參數:第一個參數 addr 即監聽位址;第二個參數表示服務端處理程式,通常為空
    //第二個參數為空意味着服務端調用 http.DefaultServeMux 進行處理
    http.ListenAndServe("127.0.0.1:8000", nil)
}      

浏覽器輸入url位址:

Go基礎程式設計:HTTP程式設計

伺服器運作結果:

2 HTTP用戶端

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

func main() {

    //get方式請求一個資源
    //resp, err := http.Get("http://www.baidu.com")
    //resp, err := http.Get("http://www.neihan8.com/article/index.html")
    resp, err := http.Get("http://127.0.0.1:8000/go")
    if err != nil {
        log.Println(err)
        return
    }

    defer resp.Body.Close() //關閉

    fmt.Println("header = ", resp.Header)
    fmt.Printf("resp status %s\nstatusCode %d\n", resp.Status, resp.StatusCode)
    fmt.Printf("body type = %T\n", resp.Body)

    buf := make([]byte, 2048) //切片緩沖區
    var tmp string

    for {
        n, err := resp.Body.Read(buf) //讀取body包内容
        if err != nil && err != io.EOF {
            fmt.Println(err)
            return
        }

        if n == 0 {
            fmt.Println("讀取内容結束")
            break
        }
        tmp += string(buf[:n]) //累加讀取的内容
    }

    fmt.Println("buf = ", string(tmp))
}      

參考資料