golang,go,博客,开源,编程
在 Go 语言中,net/http
包提供了强大的 HTTP 客户端功能,允许你发送 HTTP 请求并处理响应。以下是一个简单的示例,展示了如何使用 Go 的 http.Client
来发送 GET 和 POST 请求。
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))
}
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))
}
如果你需要处理 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)
}
你可以通过设置 http.Client
的 Timeout
字段来为请求设置超时。
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
的超时、请求头等参数,你可以进一步定制请求行为。