1. 程式人生 > 實用技巧 >golang學習筆記 --- HTTP 客戶端

golang學習筆記 --- HTTP 客戶端

Get 函式
語法:

Get(url string) (resp *Response, err error)

引數:
字串型別的 url 地址,需要注意的是這裡要是完整地址,要加上 http:// 或 https:// 的地址


返回值:

  • *Response 如果獲取到了資料,會將資料儲存在 Response 中
  • error 如果請求資料的時候出現錯誤,會返回一個 error ,並將具體的錯誤記錄到 error 中
package main

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

const url  
= "https://broqiang.com" func main() { // 方式一,直接通過 Get 函式 resp, err := http.Get(url) ErrPrint(err) defer resp.Body.Close() // 拿到資料 bytes, err := ioutil.ReadAll(resp.Body) ErrPrint(err) // 這裡要格式化再輸出,因為 ReadAll 返回的是位元組切片 fmt.Println("------------- 方法一 ---------------") fmt.Printf(
"%s",bytes) // 方式二,通過 client 結構體的 Get 方法 client := new(http.Client) // client = &http.Client{} resp, err = client.Get(url) ErrPrint(err) defer resp.Body.Close() res, err := ioutil.ReadAll(resp.Body) ErrPrint(err) fmt.Println("\n\n\n------------- 方法二 ---------------") fmt.Printf(
"%s",res) } func ErrPrint(err error) { if err != nil { log.Fatalln(err) os.Exit(1) } }

Post
這個方法也比較簡單,就是通過 Post 方式和伺服器端互動。

POST 函式
語法:

(url string, contentType string, body io.Reader) (resp *Response, err error)

引數:

  • 字串型別的 url 地址,需要注意的是這裡要是完整地址,要加上 http:// 或 https:// 的地址
  • 字串型別的 contentType ,Post 提交資料的型別,常見的有下面 4 種:
    • application/x-www-form-urlencoded 不設定 enctype 屬性的原生 form 表單提交方式。
    • multipart/form-data 上傳檔案時的資料提交方式,相當於 form 表單的 enctype 等於 multipart/form-data 。
    • application/json 用來告訴服務端訊息主體是序列化後的 JSON 字串。
    • text/xml 它是一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠端呼叫規範,和 json 作用型別。
  • 實現了 io.Reader 介面的資料。 如: 可以通過 strings.NewReader() 方法將普通字串實現 io.Reader 介面。

返回值:

  • *Response 如果獲取到了資料,會將資料儲存在 Response 中
  • error 如果請求資料的時候出現錯誤,會返回一個 error ,並將具體的錯誤記錄到 error

server.go

package main

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

func main() {
    http.HandleFunc("/hello", func(w http.ResponseWriter, req *http.Request) {
        if req.Method == "POST" {
            fmt.Fprintf(w,"Hello %s\n",req.FormValue("name"))
            return
        }

        http.NotFound(w,req)
    })

    log.Fatalf("%v",http.ListenAndServe("localhost:8080",nil))
}

client.go

package main

import (
    "log"
    "os"
    "net/http"
    "strings"
    "fmt"
    "io/ioutil"
    "io"
)

const url  = "http://localhost:8080/hello"

func main() {
    // 方式一,直接通過 Post 函式
    fmt.Println("------------- 方法一 ---------------")
    resp, err := http.Post(url,"application/x-www-form-urlencoded",
        strings.NewReader("name=Bro Qiang"))
    ErrPrint(err)
    defer resp.Body.Close()

    DataPrint(resp.Body)

    // 方式二,通過 client 結構體中的 Post 方法
    fmt.Println("------------- 方法二 ---------------")
    client := &http.Client{}
    resp, err = client.Post(url,"application/x-www-form-urlencoded",
        strings.NewReader("name=New Bro Qiang"))
    ErrPrint(err)
    defer resp.Body.Close()

    DataPrint(resp.Body)
}

func DataPrint(body io.ReadCloser) {
    // 拿到資料
    bytes, err := ioutil.ReadAll(body)
    ErrPrint(err)

    // 這裡要格式化再輸出,因為 ReadAll 返回的是位元組切片
    fmt.Printf("%s",bytes)
}

func ErrPrint(err error)  {
    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }
}

另外一種方式 PostForm 方法

可以通過 client 結構體的 PostForm () 方法獲取資料,其實兩種方式是一樣的,PostForm () 函式也是呼叫的結構體中的 PostForm () 方法。詳細的使用可以見示例中的用法

package main

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

const url = "http://localhost:8080/form"

func main() {
    data := map[string][]string{"name": {"Bro Qiang"}, "gender": {"male"}}

    // 方法一:PostForm 函式
    resp, err := http.PostForm(url, data)
    ErrPrint(err)
    defer resp.Body.Close()

    DataPrint(resp.Body)

    // 方法二:client 結構體的 PostForm 方法
    client := &http.Client{}
    resp, err = client.PostForm(url, data)
    ErrPrint(err)
    defer resp.Body.Close()

    DataPrint(resp.Body)
}

func DataPrint(body io.ReadCloser) {
    // 拿到資料
    bytes, err := ioutil.ReadAll(body)
    ErrPrint(err)

    // 這裡要格式化再輸出,因為 ReadAll 返回的是位元組切片
    fmt.Printf("%s\n", bytes)
}

func ErrPrint(err error) {
    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }
}