【Golang】如何使用Goang封装一个Http Client ?

本文介绍了如何使用Go语言标准库net/http包来封装HTTP客户端,包括HTTP协议基础知识、net/http包的功能概述,以及如何发送GET、POST、PUT请求,处理Cookie、文件上传和重定向。
摘要由CSDN通过智能技术生成


前言

如何使用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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值