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

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

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值