Golang发送GET、POST、PUT、DELETE请求

2020-04-09  本文已影响0人  懒人程序猿

golang发送GET、POST、PUT、DELETE请求

package requests

import (
    "compress/gzip"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net/http"
)

type Headers map[string]string

type Cookies []*http.Cookie

type Data map[string]interface{}

// params
type Params struct {
    Data Data
    Headers Headers
    Cookies Cookies
}

// debugger
var Debugger bool = false

// response
type responses struct {
    Response *http.Response
    Body string
}

func request(method string, url string, params Params) (r responses, e error) {
    // 打印debugger发起请求
    printSendDebugger(method, url, params)
    r, e = do(method, url, params)
    if e != nil {
        return
    }
    // 打印debugger返回请求
    printResultDebugger(r)
    return
}

func do(method string, url string, params Params) (r responses, e error) {
    request, e := http.NewRequest(method, url, nil)
    // header
    addHeaders(request, params.Headers)
    // cookie
    addCookies(request, params.Cookies)
    // 参数
    addData(request, params.Data)
    r.Response, e = http.DefaultClient.Do(request)
    defer r.Response.Body.Close()
    if e != nil {
        return
    }
    unCoding(&r)
    return
}

func addHeaders(request *http.Request, headers Headers) {
    for k, v := range headers{
        request.Header.Add(k, v)
    }
}

// 添加cookie
func addCookies(request *http.Request, cookies Cookies) {
    for _, v := range cookies{
        request.AddCookie(v)
    }
}

// 添加参数
func addData(request *http.Request, data Data) {
    query := request.URL.Query()
    for k, v := range data{
        query.Add(k, fmt.Sprint(v))
    }
    request.URL.RawQuery = query.Encode()
}

func unCoding(r *responses) {
    if r.Response.StatusCode == 200 {
        switch r.Response.Header.Get("Content-Encoding") {
        case "gzip":
            reader, _ := gzip.NewReader(r.Response.Body)
            for {
                buf := make([]byte, 1024)
                n, err := reader.Read(buf)
                if err != nil && err != io.EOF {
                    panic(err)
                }
                if n == 0 {
                    break
                }
                r.Body += string(buf)
            }
        default:
            bodyByte, _ := ioutil.ReadAll(r.Response.Body)
            r.Body = string(bodyByte)
        }
    } else {
        bodyByte, _ := ioutil.ReadAll(r.Response.Body)
        r.Body = string(bodyByte)
    }
}

// debugger发起请求
func printSendDebugger(method string, url string, params Params) {
    if Debugger {
        log.Println("debug log start ----------")
        fmt.Println("Method", method)
        fmt.Println("Host", ":", url)
        for k, v := range params.Headers{
            fmt.Println(k, ":", v)
        }
        fmt.Println("----------------------------------------------------")
    }
}

func printResultDebugger(r responses) {
    if Debugger {
        fmt.Println("Status", ":", r.Response.Status)
        for key, val := range r.Response.Header {
            fmt.Println(key, ":", val[0])
        }
        log.Println("debug log end ----------")
    }
}

// request
func Request(method string, url string, params Params) (responses, error) {
    return request(method, url , params)
}

// get
func Get(url string, params Params) (responses, error) {
    return request("GET", url , params)
}

// post
func Post(url string, params Params) (responses, error) {
    return request("POST", url , params)
}

// put
func Put(url string, params Params) (responses, error) {
    return request("PUT", url , params)
}

// delete
func Delete(url string, params Params) (responses, error) {
    return request("DELETE", url , params)
}




测试请求

func main() {
    requests.Debugger = true
    var params requests.Params
    params.Data = requests.Data{
        "id": 100000,
        "name": "赵云",
        "sid": 10,
    }
    params.Cookies = requests.Cookies{
        {Name: "id", Value: "1"},
        {Name: "name", Value: "zhaoyun"},
        {Name: "sid", Value: "10"},
    }
    params.Headers = requests.Headers{
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36",
        "Content-Type": "text/plain; charset=UTF-8",
        "Transfer-Encoding": "chunked",
        "Accept-Encoding": "gzip, deflate",
        "Authorization": "",
    }
    r, e := requests.Request("GET", "https://www.demo.com/demo.php", params)
    if e != nil {
        fmt.Println(e)
        os.Exit(0)
    }
    fmt.Println(r.Body)
}
image.png
上一篇下一篇

猜你喜欢

热点阅读