深色模式
Go 发送 http 请求
先总结
http.Do
可配置性最高,较繁琐。
如果不用添加请求头,可以使用http.Get
、http.Post
、http.PostForm
等方法,更方便。
POST请求时,如果发送的是表单,推荐用http.PostForm
,比http.Post
更简洁。
GET 请求示例(http.Do
)
go
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
_url := "https://api.storekit.itunes.apple.com"
// [Query]
params := url.Values{}
params.Set("name", "John")
params.Set("age", "30")
_url = _url + "?" + params.Encode()
// [*http.Client]
client := &http.Client{}
// [*http.Request]
req, err := http.NewRequest("GET", _url, nil)
if err != nil {
fmt.Println(err)
return
}
// [Header]
token := payios.NewAppStoreJWT()
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
// [SEND===>]
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// [<===RECEIVE]
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
在这个示例中,我们先使用url.Values结构体创建了请求参数,然后将参数拼接到URL的后面。接着创建了一个HTTP客户端client,然后创建了一个GET请求req,并将请求头设置为User-Agent: My-Client/1.0。最后使用客户端发送请求并读取响应结果。
POST 请求示例(http.Do
)
go
package main
import (
"fmt"
"net/http"
"net/url"
"strings"
)
func main() {
urlStr := "https://www.example.com/api"
// 创建一个HTTP客户端
client := &http.Client{}
// 创建请求参数
data := url.Values{}
data.Set("username", "user")
data.Set("password", "pass")
// 创建一个POST请求
req, err := http.NewRequest("POST", urlStr, strings.NewReader(data.Encode()))
if err != nil {
fmt.Println(err)
return
}
// 添加请求头
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// 发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
在这个示例中,我们创建了一个HTTP客户端client,然后创建了一个POST请求req,使用url.Values结构体创建了请求参数,使用strings.NewReader()函数将参数编码后设置为请求体。同时设置了Content-Type请求头。最后使用客户端发送请求并读取响应结果。
http.Get
go
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
urlStr := "https://www.example.com"
// 创建请求参数
params := url.Values{}
params.Set("name", "John")
params.Set("age", "30")
// 将参数拼接到URL后面
urlWithParams := urlStr + "?" + params.Encode()
// 创建一个GET请求
resp, err := http.Get(urlWithParams)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
http.Post
go
package main
import (
"fmt"
"net/http"
"net/url"
"strings"
)
func main() {
urlStr := "https://www.example.com/api"
// 创建请求参数
data := url.Values{}
data.Set("username", "user")
data.Set("password", "pass")
// 发送一个POST请求
resp, err := http.Post(urlStr, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
http.PostForm
go
package main
import (
"fmt"
"net/http"
"net/url"
"strings"
)
func main() {
urlStr := "https://www.example.com/api"
// 创建请求参数
data := url.Values{}
data.Set("username", "user")
data.Set("password", "pass")
// 发送一个POST请求
resp, err := http.PostForm(urlStr, data)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}