使用http.Client函数发送定制化的HTTP请求
Go语言内置的 net/http
包提供了一个 Client
类型,通过调用其 Do
方法可以发送一个HTTP请求,获取响应状态码以及响应内容。下面将详细介绍如何使用 http.Client
发送定制化的HTTP请求。
创建HTTP请求
在使用 http.Client
发送HTTP请求之前,需要先创建HTTP请求对象,其中包括请求的方法、URL、请求体等信息。下面使用POST方法发送一个JSON格式的HTTP请求:
package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main() {
data := map[string]interface{}{
"name": "John",
"age": 30,
}
body, _ := json.Marshal(data)
req, _ := http.NewRequest(http.MethodPost, "https://example.com/api", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
}
在上面的代码中,创建HTTP请求使用了 http.NewRequest
函数,该函数接收三个参数,分别是请求方法、请求URL、请求体。这里使用了JSON格式的请求体,通过 json.Marshal
函数将map类型的数据转换为字节数组。
第三行代码设置了HTTP请求的Content-Type为application/json,表示请求体是JSON格式的数据。
发送HTTP请求
当HTTP请求对象创建完成后,就可以使用 http.Client
发送HTTP请求了。下面是一个示例:
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
// handle error
}
defer resp.Body.Close()
在上面的代码中,创建了一个 http.Client
对象,在使用其 Do
方法发送HTTP请求时,需要传入HTTP请求对象作为参数。发送HTTP请求可能会出现错误,需要通过判断返回值中的error来处理错误。最后使用 defer
关键字关闭HTTP响应体。
获取HTTP响应状态码及响应内容
当HTTP请求发送成功后,会收到远程服务器返回的HTTP响应。在获取HTTP响应状态码及响应内容时,需要解析HTTP响应对象,获取其中的状态码和响应体。下面是一个示例:
if resp.StatusCode == http.StatusOK {
// handle success
} else {
// handle failure
}
body, _ := ioutil.ReadAll(resp.Body)
在上面示例中,根据HTTP响应的状态码来区分是成功还是失败的响应。对于成功的响应,可以解析HTTP响应体,通过 ioutil.ReadAll
函数将HTTP响应体读取到字节数组中。
设置超时时间
发送HTTP请求时,有时候需要设置超时时间,防止请求一直等待。下面是一个示例:
client := &http.Client{
Timeout: time.Second * 10, // 设置超时时间为10秒
}
resp, err := client.Do(req)
if err != nil {
// handle error
}
defer resp.Body.Close()
在上面的示例中,创建了一个 http.Client
对象,并设置了超时时间为10秒。当请求等待超过10秒时,将自动取消该请求并返回“net/http: request canceled while waiting for connection”错误。
完整示例
下面是一个完整的示例程序,用来发送定制化的HTTP请求、获取响应状态码及响应内容,并设置超时时间:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
func main() {
// 创建HTTP请求
data := map[string]interface{}{
"name": "John",
"age": 30,
}
body, _ := json.Marshal(data)
req, _ := http.NewRequest(http.MethodPost, "https://example.com/api", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
// 发送HTTP请求
client := &http.Client{
Timeout: time.Second * 10, // 设置超时时间为10秒
}
resp, err := client.Do(req)
if err != nil {
// handle error
}
defer resp.Body.Close()
// 获取HTTP响应状态码及响应内容
if resp.StatusCode == http.StatusOK {
bodyBytes, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(bodyBytes))
} else {
fmt.Println(resp.StatusCode)
}
}
在上面的程序中,将发送HTTP请求的代码、设置超时时间的代码、获取HTTP响应状态码及响应内容的代码都写在了一个程序中,通过运行该程序,可以完整地看到如何使用 http.Client
发送定制化的HTTP请求并获取响应状态码及响应内容。