前言
如何使用Goang封装一个Http Client ?
一、Http是什么?
HTTP(HyperText Transfer Protocol)是超文本传输协议的缩写,是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础。
HTTP遵循标准客户端-服务器模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。这使得它在大规模的网页服务器上非常有用,因为它不需要服务器在客户端和自身之间保留信息。
HTTP使用统一资源标识符(URI)来传输数据和建立连接。HTTP的方法(如GET,POST,PUT,DELETE等)定义了对于指定资源的不同操作。
HTTP消息包括客户端到服务器的请求和服务器到客户端的响应。请求和响应消息的头部包含有关消息的元信息,如内容的MIME类型,消息的长度,其他参数等。
HTTP的主要版本有HTTP/1.0,HTTP/1.1和HTTP/2。其中,HTTP/2在性能上有了显著的改进,如服务器推送,头部压缩等。
总的来说,HTTP是互联网上数据交换的基础,它定义了浏览器如何向服务器请求信息,以及服务器如何将这些信息返回给浏览器。
二、代码实现
1.net/http包
net/http是Go标准库中的一个包,它提供了HTTP客户端和服务器的实现。
以下是net/http包的一些主要功能:
HTTP客户端:你可以使用http.Get,http.Post等函数发送HTTP请求,或者使用http.Client类型更灵活地发送请求。你还可以使用http.Request类型来构造HTTP请求。
HTTP服务器:你可以使用http.ListenAndServe函数来启动一个HTTP服务器,并使用http.HandleFunc函数来注册处理函数。你还可以使用http.ResponseWriter类型和http.Request类型来处理HTTP请求。
Cookie处理:http包提供了http.Cookie类型来表示HTTP cookie,你可以使用http.SetCookie函数和http.Request.Cookie方法来设置和读取cookie。
文件上传和下载:http包提供了处理文件上传和下载的功能。你可以使用http.Request.FormFile方法来处理文件上传,使用http.ServeFile函数或者http.FileServer函数来处理文件下载。
HTTP重定向:。你可以使用http.Redirect函数来发送HTTP重定向响应。
总的来说,net/http包提供了处理HTTP请求和响应的各种工具,是编写Web应用程序的基础。
2.代码实现
代码如下(示例):
package main
import (
"bytes"
"io/ioutil"
"log"
"net/http"
"net/url"
)
func doRequest(method, urlStr, body string, params map[string]string, headers map[string]string) {
client := &http.Client{}
// Construct URL with query parameters for GET request
if method == "GET" && params != nil {
urlObj, _ := url.Parse(urlStr)
query := urlObj.Query()
for key, value := range params {
query.Set(key, value)
}
urlObj.RawQuery = query.Encode()
urlStr = urlObj.String()
}
var req *http.Request
var err error
if body != "" {
reqBody := bytes.NewBuffer([]byte(body))
req, err = http.NewRequest(method, urlStr, reqBody)
req.Header.Set("Content-Type", "application/json")
} else {
req, err = http.NewRequest(method, urlStr, nil)
}
if err != nil {
log.Fatal(err)
}
// Set custom headers
for key, value := range headers {
req.Header.Set(key, value)
}
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
log.Println("Response:", string(respBody))
}
func main() {
// GET request with query parameters
params := map[string]string{"key1": "value1", "key2": "value2"}
headers := map[string]string{"Custom-Header": "Custom-Value"}
doRequest("GET", "http://example.com", "", params, headers)
// POST and PUT requests with request body
doRequest("POST", "http://example.com", `{"key":"value"}`, nil, headers)
doRequest("PUT", "http://example.com", `{"key":"new value"}`, nil, headers)
}
在这个示例中,doRequest函数接受一个新的参数:一个映射,它将字符串映射到字符串。这个映射表示自定义的HTTP头。
在创建http.Request实例后,我们遍历这个映射,并使用http.Header类型的Set方法来设置每个头的值。
总结
使用Goang中的net/http包实现封装一个Http Client。