当前位置: 首页 > 工具软件 > gohttp > 使用案例 >

go 学习笔记之http请求

滕翔飞
2023-12-01

go 学习笔记之http请求

今天学习一下,如何用原生的http包优雅的发起http请求。

先准备服务端接口,这里使用的是gin框架

package main

import (
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
	"net/http"
)

var logger = log.Default()

func main() {
	engine := gin.Default()
	engine.GET("/get", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})

	engine.POST("/post", func(context *gin.Context) {
		body, _ := ioutil.ReadAll(context.Request.Body)
		log.Printf("body:%s", body)
		context.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})

	})

	engine.POST("/postForm", func(context *gin.Context) {
		name := context.PostForm("name")
		logger.Printf("name:%s", name)
		context.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})

	engine.HEAD("/head", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})


	engine.POST("/complex", func(context *gin.Context) {
		// 从url获取拼接参数
		env := context.Query("env")
		logger.Printf("env:%s", env)

		// 获取请求头参数
		header := context.Request.Header
		logger.Printf("Cookie:%s", header.Get("Cookie"))
		logger.Printf("Content-Type:%s", header.Get("Content-Type"))
		logger.Printf("Token:%s", header.Get("Token"))

		// 获取请求体参数
		body, _ := ioutil.ReadAll(context.Request.Body)
		log.Printf("body:%s", body)
		context.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})


	engine.Run(":8080")
}

1.简单请求

go官方提供了Get、Head、Post和PostForm函数来发送请求。

1.1 Get方法

package main

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

var logger = log.Default()

func main() {
	resp, err := http.Get("http://localhost:8080/get") // url
	if err != nil {
		logger.Printf("get请求失败 error: %+v", err)
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logger.Printf("读取Body失败 error: %+v", err)
		return
	}
	logger.Println(string(body))
}

1.2 Post方法

package main

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

var logger = log.Default()

func main() {
	resp, err := http.Post("http://localhost:8080/post", // url
		"text/json;charset=utf-8",// contentType 内容类型
		strings.NewReader("{\"name\":\"jack\"}")) // body请求体
	if err != nil {
		logger.Printf("post请求失败 error: %+v", err)
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logger.Printf("读取Body失败 error: %+v", err)
		return
	}
	logger.Println(string(body))
}

1.3 PostForm方法

package main

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

var logger = log.Default()

func main() {
	resp, err := http.PostForm("http://localhost:8080/postForm", // url
		url.Values{
			"name": {"jack"}, // data 
		})
	if err != nil {
		logger.Printf("postForm请求失败 error: %+v", err)
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logger.Printf("读取Body失败 error: %+v", err)
		return
	}
	logger.Println(string(body))
}

1.4 Head方法

package main

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

var logger = log.Default()

func main() {
	resp, err := http.Head("http://localhost:8080/head")
	if err != nil {
		logger.Printf("Head请求失败 error: %+v", err)
		return
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logger.Printf("读取Body失败 error: %+v", err)
		return
	}
	logger.Println(string(body))
}

2. 复杂请求

很多请求下,请求是比较复杂的,下面展示复杂一点的请求。

package main

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

var logger = log.Default()

func main() {
	// 准备入参
	// 用户实体
	type User struct {
		Id   int    `json:"id"`
		Name string `json:"name"`
	}
	user := User{
		Id:   1,
		Name: "bob",
	}
	jsonBytes, err := json.Marshal(user)
	if err != nil {
		logger.Printf("序列化用户失败!err:%+v", err)
		return
	}

	// 创建客户端
	client := &http.Client{}
	// 创建请求
	request, err := http.NewRequest("POST", "http://localhost:8080/complex?env=dev", bytes.NewReader(jsonBytes))
	if err != nil {
		logger.Printf("创建请求失败!err:%+v", err)
		return
	}
	// 设置请求头
	request.Header.Add("Cookie", "123")
	request.Header.Add("Content-Type", "application/json;charset=utf-8")
	request.Header.Add("Token", "456")

	// 设置1分钟的超时时间
	client.Timeout = 1 * time.Minute
	
	// 发起请求
	resp, err := client.Do(request)

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logger.Printf("读取Body失败 error: %+v", err)
		return
	}
	logger.Println(string(body))
}

 类似资料: