go 网络请求封装

HTTP

简单demo

url := "http://www.xiaohuar.com"  //定义一个URl。
resp,err := http.Get(url) //获取url的内容。
if err != nil {//如果有异常就打印异常
    log.Fatal(err)
}
defer resp.Body.Close()  //在方法运行完后关闭连接,万要关闭链接,不然会造成资源泄露。
if resp.StatusCode != http.StatusOK{ //如果返回状出现错误,就抛出错误。
    log.Fatal(resp.Status)
}
io.Copy(os.Stdout,resp.Body) //将正常的结果输出到屏上,并不会占用内存。

一个封装好的方法

//发送请求
func fetchUrl(data interface{}, url string, method string, resu interface{}) (error) {
    var res *http.Response
    var err error
    switch method {
    case http.MethodGet:
        res, err = http.Get(url)
        if err != nil {
            return err
        }
        break
    case http.MethodPost:
        jsonBytes, err := json.Marshal(data)
        if err != nil {
            return err
        }
        bodyReader := bytes.NewBuffer(jsonBytes)
        res, err = http.Post(url, "text/xml", bodyReader)
        if err != nil {
            return err
        }
        break
    }
    Body := res.Body
    defer Body.Close()
    body, err := ioutil.ReadAll(Body)
    fmt.Println(string(body))
    if err != nil {
        return err
    }
    err = json.Unmarshal(body, resu)
    if err != nil {
        return err
    }
    return nil
}

封装方法升级

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/url"
    "net/http"
    "bytes"
)

// 发送get请求
func FetchGet(url string, resu interface{}) (error) {
    fmt.Println("[Request method:]" + http.MethodGet)
    fmt.Println("[Request url:]" + url)
    res, err := http.Get(url)
    if err != nil {
        return err
    }
    return creatResult(res, resu)
}

// 发送post请求
// postData     post方法要发送的数据
// url          请求的路由
// method       请求方法
// resu         请求反馈
func FetchPost(postData interface{}, url string, resu interface{}) (error) {
    fmt.Println("[Request method:]" + http.MethodPost)
    fmt.Println("[Request url:]" + url)
    data := []byte{}
    if postData != nil {
        buffer := &bytes.Buffer{}
        encoder := json.NewEncoder(buffer)
        encoder.SetEscapeHTML(false) //取消特殊字符转义
        err := encoder.Encode(postData)
        if err != nil {
            return err
        }
        data = buffer.Bytes()
    }
    fmt.Println("postJsonBytes===", string(data))
    bodyReader := bytes.NewBuffer(data)
    res, err := http.Post(url, "text/xml", bodyReader)
    if err != nil {
        return err
    }
    return creatResult(res, resu)
}

// 发送post请求
// postData     post方法要发送的数据
// url          请求的路由
// method       请求方法
// resu         请求反馈
func FetchPostForm(postForm map[string]string, post_url string, resu interface{}) (error) {
    fmt.Println("[Request method:]" + http.MethodPost)
    fmt.Println("[Request url:]" + post_url)
    val := url.Values{}
    for k, v := range postForm {
        val.Set(k, v)
    }
    res, err := http.PostForm(post_url, val)
    if err != nil {
        return err
    }
    return creatResult(res, resu)
}

// 处理反馈信息
func creatResult(r *http.Response, resu interface{}) error {
    Body := r.Body
    defer Body.Close()
    body, err := ioutil.ReadAll(Body)
    if err != nil {
        return err
    }
    fmt.Println("[Status:]", r.Status)
    fmt.Println("[Response :]" + string(body))
    if r.StatusCode != http.StatusOK {
        return fmt.Errorf("statusCode :%v ; body :%v", r.StatusCode, string(body))
    }
    if resu == nil {
        return nil
    }
    return json.Unmarshal(body, resu)
}

URL

s := "http://www.xiaohuar.com"//定义地址
u,err := url.Parse(s)           //请求地址
if err != nil {//如果有异常就打印异常
    log.Fatal(err)
}
fmt.Println("使用的协议是:",u.Scheme)
fmt.Println("主机名称是:",u.Host)
fmt.Println("当前路径是:",u.Path)
fmt.Println("请求信息是:",u.RawQuery)
fmt.Println("用户信息是:",u.User)
fmt.Println("当前的锚点是:",u.Fragment)

你可能感兴趣的:(go 网络请求封装)