go語言http設置及超時請求

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))
}

原貼地址:http://www.cnblogs.com/jackylee92/p/6214591.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章