golang,go,博客,开源,编程

了解http.Client

Published on with 0 views and 0 comments

在 Go 语言中,net/http 包提供了强大的 HTTP 客户端功能,允许你发送 HTTP 请求并处理响应。以下是一个简单的示例,展示了如何使用 Go 的 http.Client 来发送 GET 和 POST 请求。

1. 发送 GET 请求

package main

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

func main() {
	// 创建一个 HTTP 客户端
	client := &http.Client{}

	// 创建一个 GET 请求
	req, err := http.NewRequest("GET", "https://jsonplaceholder.typicode.com/posts/1", nil)
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error making request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}

	// 打印响应体
	fmt.Println("Response:", string(body))
}

2. 发送 POST 请求

package main

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

func main() {
	// 创建一个 HTTP 客户端
	client := &http.Client{}

	// 准备 POST 请求的数据
	postData := []byte(`{"title":"foo","body":"bar","userId":1}`)

	// 创建一个 POST 请求
	req, err := http.NewRequest("POST", "https://jsonplaceholder.typicode.com/posts", bytes.NewBuffer(postData))
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error making request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}

	// 打印响应体
	fmt.Println("Response:", string(body))
}

3. 处理 JSON 响应

如果你需要处理 JSON 格式的响应,可以使用 encoding/json 包来解析响应体。

package main

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

type Post struct {
	UserId int    `json:"userId"`
	Id     int    `json:"id"`
	Title  string `json:"title"`
	Body   string `json:"body"`
}

func main() {
	// 创建一个 HTTP 客户端
	client := &http.Client{}

	// 创建一个 GET 请求
	req, err := http.NewRequest("GET", "https://jsonplaceholder.typicode.com/posts/1", nil)
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error making request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}

	// 解析 JSON 响应
	var post Post
	err = json.Unmarshal(body, &post)
	if err != nil {
		fmt.Println("Error unmarshalling JSON:", err)
		return
	}

	// 打印解析后的结构体
	fmt.Printf("Post: %+v\n", post)
}

4. 设置超时

你可以通过设置 http.ClientTimeout 字段来为请求设置超时。

package main

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

func main() {
	// 创建一个带有超时的 HTTP 客户端
	client := &http.Client{
		Timeout: 10 * time.Second,
	}

	// 创建一个 GET 请求
	req, err := http.NewRequest("GET", "https://jsonplaceholder.typicode.com/posts/1", nil)
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error making request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}

	// 打印响应体
	fmt.Println("Response:", string(body))
}

总结

Go 的 net/http 包提供了非常灵活的 HTTP 客户端功能,可以轻松地发送各种类型的 HTTP 请求,并处理响应。通过设置 http.Client 的超时、请求头等参数,你可以进一步定制请求行为。


标题:了解http.Client
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/14/1739519922638.html
联系:scotttu@163.com