Go语言http简单封装,自己理解

本文介绍了Go语言中进行HTTP请求的方法,包括无参数的GET请求、带参数的GET请求、无参数的POST请求以及带参数和body的POST请求。通过示例代码展示了如何构造URL、设置请求头、发送请求并处理响应。同时,还提供了一个简单的HTTP响应处理函数,方便读取和处理HTTP响应体。
摘要由CSDN通过智能技术生成

1.无参数Get请求

package main

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

func main(){
    resp, err := http.Get("http://baidu.com/")
    if err != nil {
    // handle error
    }
    defer resp.Body.Close()   //关闭body
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {   //处理错误
        // handle error
    }
    fmt.Println(string(body))
}

2.有参数Get请求

func main() {

    apiUrl := "http://127.0.0.1:9090/get"
    data := url.Values{}
    data.Set("name", "xiaomi")
    data.Set("age", "18")
    //把string转换为url
    u, err := url.ParseRequestURI(apiUrl)
    if err != nil {
        fmt.Println("parese url requestUrl failed,err:", err)
    }
    //URL encode
    u.RawQuery = data.Encode() 
    fmt.Println(u.String())
    resp, err := http.Get(u.String())
    if err != nil {
        fmt.Println("get failed, err:", err)
        return
    }
    defer resp.Body.Close()
    //读取内容
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("get resp failed, err:", err)
        return
    }
    fmt.Println(string(b))
}

可以把拼接Url的部分单独领出来,变成:

package main

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

func ConvertToQueryParams(requrl string ,params map[string]string) string {
    data := url.Values{}
    for key, value := range params {
        data.Set(key, value)
    }
    u, _ := url.ParseRequestURI(requrl)
    u.RawQuery = data.Encode()
    return u.String()
}

func main{
    Url := "http://127.0.0.1:9090/get"
    params := map[string]string{"name":"xiaomi","age":"18"}
    requrl := ConvertToQueryParams(Url,params)
    resp, err := http.Get(requrl)
    if err != nil {
        fmt.Println("get failed, err:", err)
        return
    }
    defer resp.Body.Close()
    //读取内容
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("get resp failed, err:", err)
        return
    }
    fmt.Println(string(b))
}

3.有body无参数Post请求

package main

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

func main() {

    //Post请求示例
    url := "http://127.0.0.1:9090/post"
    // 表单数据
    //contentType := "application/x-www-form-urlencoded"
    //data := "name=枯藤&age=18"
    // json
    contentType := "application/json"
    data := `{"name":"xiaomi","age":18}`
    resp, err := http.Post(url, contentType, strings.NewReader(data))
    if err != nil {
        fmt.Println("post failed, err:", err)
        return
    }
    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("get resp failed, err", err)
        return
    }
    fmt.Println(string(b))
}

4.有body有参数Post请求(参数是指url内"?"后面的键值对)

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
    "net/url"
)
//依旧单独分出来Url拼接的部分
func ConvertToQueryParams(requrl string ,params map[string]string) string {
    data := url.Values{}
    for key, value := range params {
        data.Set(key, value)
    }
    u, _ := url.ParseRequestURI(requrl)
    u.RawQuery = data.Encode()
    return u.String()
}


func main(){
    //post请求带参数和body
    appiurl := "http://127.0.0.1:9090/post"
    params := map[string]string{"access_token":"d3cb174XXXXX",}
    body := `{"name":"xiaomi","age":"18"}`
    resp,_ := http.Post(ConvertToQueryParams(appiurl,params),"application/json",strings.NewReader(body))
    b, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(b))
    defer resp.Body.Close()
}

最后还可以吧读取返回的Body简单封装,看个人需要

package http

import (
	"bytes"
	"crypto/tls"
	"io/ioutil"
	"net/http"
	"strings"
)

var httpClient = &http.Client{}

func init() {
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	httpClient = &http.Client{Transport: tr}
}


//也可以返回成string,改写最后的return为string(b)
func ResponseHandle(resp *http.Response, err error) ([]byte, error) {
	if err != nil {
		return []byte(""), err
	}
	b, err := ioutil.ReadAll(resp.Body)
	defer resp.Body.Close()
	if err != nil {
		return []byte(""), err
	}
	return b, nil
}

func XPost(url string, params map[string]string, body string) ([]byte, error) {
	resp, err := httpClient.Post(ConvertToQueryParams(url,params), "application/json", strings.NewReader(body))
	return ResponseHandle(resp, err)
}

func XGet(url string, params map[string]string) ([]byte, error) {
	resp, err := httpClient.Get(ConvertToQueryParams(url,params))
	return ResponseHandle(resp, err)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值