Golang網路編程-http編程

introduction

  • golang原生支持http
    • 只需import "net/http"即可使用http相關的功能
  • goalng的http服務性能和nginx非常接近
  • 只需幾行代碼就能實現一個簡單的web服務

http Server實現

  • 使用http.HandleFunc函數設置web路由,針對用戶輸入的url進行處理
    • 傳入相對應用戶輸入的url,使用不同的函數進行處理
    • http.HandleFunc(web路由路徑,處理函數)
  • http.ListenAndServe()將tcp編程的的ListenAccept等代表server端函數都封裝了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"fmt"
//引入http package
"net/http"
)

func Hello(w http.ResponseWriter,r *http.Request){
fmt.Println("handle Hello")
_,_ = fmt.Fprintf(w,"hello")
}

func update(w http.ResponseWriter,r *http.Request){
fmt.Println("Update!!")
_,_ = fmt.Fprintf(w,"updating!!!")
}

func main(){
//設置web路由規則,針對用戶輸入的url進行處理
http.HandleFunc("/",Hello)
http.HandleFunc("/update",update)

//開啟服務
err := http.ListenAndServe("0.0.0.0:8888",nil)
if err != nil {
fmt.Println("Listen Failed!!")
}
}

http Client

  • 客戶端(Client)用於調用服務端(Server)的服務
  • 其Get方法預設使用內部已實現的客戶端
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package main

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

    func main(){
    //參數可替換欲請求的網址
    res,err := http.Get("http://taroballz.com")
    if err !=nil {
    fmt.Println("get err:",err)
    return
    }
    //成功Get到後結束時一定要記得關掉
    defer res.Body.Close()
    //res.Body實現了Reader接口
    data,err := ioutil.ReadAll(res.Body)
    if err !=nil{
    fmt.Println("get data err:",err)
    return
    }
    fmt.Println(string(data))
    }

http常見請求

  • Get請求:
    • 用於請求返回數據(讀)
    • data位於url的後面
    • url長度有限制
    • 沒有包體
  • Post請求:
    • data位於包體中
    • 其提交的data長度不受限制
    • 用於更新資源
  • Put請求:
    • 用於創建資源
  • Delete請求:
    • 用於刪除資源
  • Head請求:
    • 請求封包頭
    • 通常用於查看服務正不正常,而不返回數據

http Head請求

  • http.Head(url):使用Head請求對應的url
  • 其Head方法預設使用內部已實現的客戶端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"net/http"
)

var url_data []string = []string{"http://taroballz.com",
"https://ccu.edu.tw",
"http://baidu.com"}

func main(){
for _,v := range url_data{
resp,err := http.Head(v)
if err != nil {
fmt.Println("http head request failed:",err)
continue
}
fmt.Println("request succ:",resp.Status)
}
}