package main
import (
"log"
"net/http" //http 請求用
"io" // io.Copy獲取http請求狀態用;HttpPost
"os" // os.Stdout 取io.Copy 返回數據中的status;HttpPost用
"io/ioutil" //處理http獲取的數據轉換用
"strings" //HttpPost2中生成Post數據用
"net/url" //HttpPost3中定義url.Values中使用到
"time" //設置超時用
"net"
)
var my_url = "http://c-dancer.com" //全局變量鏈接
func main(){
//HttpGet()
HttpPost()
//HttpPost2()
//HttpPost3()
}
//net/http包中提供了Get/Head/Post/PostForm函數來發出http/https請求
//通過get獲取來http請求
func HttpGet(){
response,err := http.Get(my_url)
if err!= nil { //如果訪問不成功,url不存在則會進入改判斷
log.Println(err)
return
}
defer response.Body.Close() //請求完了關閉回覆主體
body,err := ioutil.ReadAll(response.Body)
log.Println(string(body))
}
//生成client 通過client的Do方法執行
func HttpPost(){
/* 生成client,參數默認;
* 這個結構體有四個屬性
* Transport(RoundTrepper);指定執行的獨立、單次http請求的機制
* CheckRedirect(func(req *Request, via []*Request)err):指定處理重定向的策略,如果不爲nil,客戶端在執行重定向之前調用本函數字段.如果CheckRedirect 返回一個錯誤,本類型中的get方法不會發送請求,如果CheckRedirect爲nil,就會採用默認策略:連續請求10次後停止;
* jar(CookieJar):jar指定cookie管理器,若果爲nil請求中不會發送cookie,回覆中的cookie會被忽略
* TimeOut(time.Duration):指定本類型請求的時間限制,爲0表示不設置超時
*/
//client := &http.Client{} 這裏初始化了一個默認的client,並沒有配置一些請求的設置
//可以通過client中transport的Dail函數,在自定義Dail函數裏面設置建立連接超時時長和發送接受數據超時
client := &http.Client{
Transport: &http.Transport{
Dial: func(netw, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(netw, addr, time.Second*2) //設置建立連接超時
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(time.Second * 2)) //設置發送接受數據超時
return conn, nil
},
ResponseHeaderTimeout: time.Second * 2,
},
}
reqest,err := http.NewRequest("POST",my_url,strings.NewReader("name=PostName")) //提交請求;用指定的方法,網址,可選的主體放回一個新的*Request
reqest.Header.Set("Content-Type","application/x-www-form-urlencoded")
if err != nil {
panic(err)
return
}
response,err := client.Do(reqest) //前面預處理一些參數,狀態,Do執行發送;處理返回結果;Do:發送請求,
defer response.Body.Close()
stdout := os.Stdout //將結果定位到標準輸出,也可以直接打印出來,或定位到其他地方進行相應處理
_,err = io.Copy(stdout,response.Body) //將第二個參數拷貝到第一個參數,直到第二參數到達EOF或發生錯誤,返回拷貝的字節喝遇到的第一個錯誤.
status := response.StatusCode //獲取返回狀態碼,正常是200
body,err := ioutil.ReadAll(response.Body)
log.Println(string(body))
log.Println(status)
}
//HTTP 包中POST 方法
func HttpPost2(){
//HTTP POST請求
req,err := http.Post(my_url,"application/x-www-form-urlencoded",strings.NewReader("name=myname"))//這裏定義鏈接和post的數據
if err != nil {
log.Println(err.Error())
return
}
defer req.Body.Close()
body,err := ioutil.ReadAll(req.Body)
if err != nil {
log.Println(err.Error())
return
}
log.Println(string(body))
}
//使用HTTP包中PostForm方法;
func HttpPost3(){
req,err := http.PostForm(my_url,url.Values{"key":{"value"},"id":{"123"}})
if err != nil {
log.Println(err.Error())
return
}
defer req.Body.Close()
body,err := ioutil.ReadAll(req.Body)
if err != nil {
log.Println(err.Error())
}
log.Println(string(body))
}
go語言http設置及超時請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.