7天玩转 Golang 标准库之 http/net

这篇具有很好参考价值的文章主要介绍了7天玩转 Golang 标准库之 http/net。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。

基础用法

一:处理HTTP请求

首先,我们来看看如何使用net/http标准库发送一个HTTP请求。net/http库中的http.Get函数可以快速地对一个URL发起GET请求。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    res, err := http.Get("http://example.com/")
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s", body)
}

二:创建和启动HTTP服务器

在Go语言中,我们可以使用http.ListenAndServe函数配合http.HandleFunc函数快速地创建一个HTTP服务器。

package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Gopher!")
}

func main() {
    http.HandleFunc("/hello", helloHandler)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

三:使用http.Client自定义请求行为

有时,我们需要对HTTP请求进行更细粒度的控制,比如设置超时时间、添加请求头等等。这个时候,我们可以使用http.Clienthttp.Request来自定义我们的请求行为。

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: 5 * time.Second,
    }

    req, err := http.NewRequest("GET", "http://example.com", nil)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Add("User-Agent", "myClient")

    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    fmt.Printf("Response status: %s\n", resp.Status)
}

以上,我们简洁明了地介绍了如何使用Golang中的net/http标准库进行HTTP请求的发送、服务器的创建以及请求行为的自定义。但是,net/http库的功能远不止这些。

进阶用法

反向代理

反向代理是一个非常常见的需求,Golang的net/http库能简单地帮我们实现这一功能。

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    targetUrl, _ := url.Parse("http://example.com")
    proxy := httputil.NewSingleHostReverseProxy(targetUrl)

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

在上述代码中,我们通过httputil.NewSingleHostReverseProxy函数创建了一个反向代理处理器,然后在http处理函数中通过这个处理器来处理进来的http请求。

升级websocket

WebSocket提供了在单个 TCP 连接上进行全双工通信的能力。在Golang中,我们可以借助golang.org/x/net/websocket包(这不是标准库,但是是官方维护的包)轻松实现WebSocket。

package main

import (
	"fmt"
	"golang.org/x/net/websocket"
	"net/http"
)

func Echo(ws *websocket.Conn) {
	var err error
	for {
		var reply string
		if err = websocket.Message.Receive(ws, &reply); err != nil {
			fmt.Println("Can't receive")
			break
		}
		fmt.Println("Received back from client: " + reply)
		msg := "Received:  " + reply
		fmt.Println("Sending to client: " + msg)
		if err = websocket.Message.Send(ws, msg); err != nil {
			fmt.Println("Can't send")
			break
		}
	}
}

func main() {
	http.Handle("/", websocket.Handler(Echo))
	if err := http.ListenAndServe(":1234", nil); err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}

在上面的例子中,我们创建了一个简单的回音服务,客户端发送一个消息到服务器,服务器会追加一个"Received: "前缀并发送回去。

需要注意的是,WebSocket 只能用于已具有兼容 WebSocket 的客户端(如一些现代 web 浏览器)的 HTTP 服务器。websocket包并不能用于一个普通的HTTP服务端。

当然,除了反向代理和Websocket, net/http包中还有诸多高级的使用方法。这里,我会介绍两个常见的高级应用场景:使用http.RoundTripper自定义HTTP请求过程和使用http.CookieJar接口处理Cookie。

自定义HTTP请求过程

如果你需要在发送HTTP请求时进行更多的自定义控制,如自定义DNS解析、TCP连接过程、TLS握手等等,那么你可以通过实现 http.RoundTripper 接口来满足需求。

package main

import (
    "fmt"
    "net/http"
    nethttp "net/http" // alias to avoid conflict
    "time"
)

type myTransport struct {
    transportation http.RoundTripper
}

func (t *myTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    req.Header.Add("User-Agent", "myClient")
    resp, err := t.transportation.RoundTrip(req)
    if err != nil {
 	   return nil, err
    }

    // you can access Response here
    fmt.Println("Status:", resp.Status)

    return resp, nil
}

func main() {
    t := &myTransport{
 	   transportation: nethttp.DefaultTransport,
    }

    client := &http.Client{Transport: t}
    resp, err := client.Get("http://example.com")
    if err != nil {
 	   log.Fatal(err)
    }
    defer resp.Body.Close()

    fmt.Println("Response Status:", resp.Status)
}

在上述代码中,我们实现了自己的 http.RoundTripper 接口,在每次发送HTTP请求时,添加了自定义的User-Agent头,并在请求返回后打印了响应的状态码。

处理Cookie

http.CookieJar 是一个接口,可以用来自定义HTTP请求中的cookie处理逻辑。Go标准库为我们提供了一个简单的内存CookieJar的实现 net/http/cookiejar

package main

import (
    "net/http"
    "net/http/cookiejar"
    "net/url"
)

func main() {
    jar, err := cookiejar.New(nil)
    if err != nil {
 	   log.Fatal(err)
    }

    client := &http.Client{
 	   Jar: jar,
    }

    // Create a cookie on client side
    client.Jar.SetCookies(
 	   &url.URL{Scheme: "http", Host: "example.com"},
 	   []*http.Cookie{{Name: "cookieName", Value: "cookieValue"}},
    )

    // Check if the cookie has been set
    if cookies := client.Jar.Cookies(&url.URL{Scheme: "http", Host: "example.com"}); len(cookies) > 0 {
 	   fmt.Println("Cookie:", cookies[0])
    }
}

在上述例子中,我们首先创建了一个新的CookieJar实例,并将其用于一个新的HTTP客户端中。然后,我们在客户端上创建了一个新的cookie,并检查它是否已经被存储在了CookieJar中。

如果这篇文章帮助了你,不妨一键三连哦?文章来源地址https://www.toymoban.com/news/detail-763931.html

到了这里,关于7天玩转 Golang 标准库之 http/net的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang每日一库之bcrypt

    官方文档: https://pkg.go.dev/golang.org/x/crypto/bcrypt 之前讲过JWT Token https://www.cnblogs.com/zichliang/p/17303759.html JWT呢是信息是经过数字签名的,因此可以被验证和信任。 然后今天就来说说密码学,我们在做鉴权 做用户处理时 会把密码存储到数据库中,但是这个密码我们肯定不能明文

    2024年02月01日
    浏览(44)
  • Golang一日一库之logrus

    之前一篇文章介绍了 日志库zap https://www.cnblogs.com/zichliang/p/17311480.html 毋庸置疑,zap库无论是Golang在项目中 还是生产中都极其优秀的一个数据库,而且他是当今Go最快的日志库 性能最高的日志库。 但是今天缺不是来说他的,今天介绍的是另一款日志库 logrus 虽然 logrus 已经不维

    2023年04月17日
    浏览(40)
  • Golang每日一库之regex

    本文地址: https://www.cnblogs.com/zichliang/p/17387436.html Golang日库合集:https://www.cnblogs.com/zichliang/category/2297320.html 正则表达式是一种用来查询、匹配或替换字符串的技术。你可以使用它来找到符合特定模式的文本、删除或替换匹配的字符串。它可以用于各种编程语言和工具中,如

    2024年02月03日
    浏览(42)
  • golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)

    今天碰到了个需求,我要知道程序对外访问的 http 请求域名的 ip 地址。 直接查看 golang 的 net/http 包,发现 Response 中并没有我想要的 ip 信息。 考虑到在 OSI 七层模型中, ip 是网络层协议,而 http 是应用层协议。去翻了下 net 包,发现了基础用法。 先提一下,域名访问服务器

    2024年02月02日
    浏览(50)
  • Golang一日一库之 日志库 zap

    在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了。 zap 是开源的 Go 高性能日志库 主要有以下特点: 支持不同的日志级别 能够打印基本信息等但不支持日志的分割 但是可以使用 lumberjack 也是 za

    2023年04月12日
    浏览(48)
  • 【Golang | Gin】net/http和Gin起web服务时的简单对比

    Gin 是一个用 Go (Golang) 编写的 Web 框架,详细介绍参考官网:https://gin-gonic.com/zh-cn/docs/introduction/ 开始学习Gin之前,我们先首先回顾下使用net/http起一个简单的helloworld服务 注: 1、 http.HandleFunc : 使用一个默认的 DefaultServeMux 来注册路由信息。 / 是一个 pattern , greet 是一个 ha

    2024年02月08日
    浏览(43)
  • Golang 一日一库之jwt-go

    本文地址 https://www.cnblogs.com/zichliang/p/17303759.html github地址:https://github.com/dgrijalva/jwt-go 什么是JSON Web Token? JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经过数字签名的,因此可以

    2023年04月11日
    浏览(46)
  • 通过Mock玩转Golang单元测试!

    如果项目中没有单元测试,对于刚刚开始或者说是规模还小的项目来说,效率可能还不错。但是一旦项目变得复杂起来,每次新增功能或对旧功能的改动都要重新手动测试一遍所有场景,费时费力,而且还有可能因为疏忽导致漏掉一些覆盖不到的点。在这个基础上,单元测试

    2024年02月05日
    浏览(39)
  • Golang标准库——io

    原文:Golang标准库——io io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。 因为这些接口和原语是对底层实现完全不同的低水平操

    2024年02月07日
    浏览(32)
  • Golang之selenium+k8s部署玩转模拟手机页面监控

    随着互联网的快速发展,用户更多的会去通过手机端去接触我们开发的产品。我们可以通过微服务,中间件,网络,甚至基于日志对我们的平台稳定性进行监控,当出现告警时,我们可以及时准确的定位系统出现的问题。 然而,当我们对底层能力做好监控时,我们并不能确保

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包