http包发送模块详解-golang

Go语言Web基础--Go的http包详解 概要 前面介绍了Go怎么样实现了Web工作模式的一个流程,这里,我们将详细地解剖一下http包,看它到底是怎样实现整个过程的。 Go的http有两个核心功能:Conn、ServeMux Conn的goroutine 与我们一般编写的http服务器不同, Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应... 阅读详情

功能简介

完成http的发送和对http服务器响应数据的处理

主要结构体简介

1.Request,Response结构体,封装http内容以及解析http协议

2.RoundTripper接口,能够执行HTTP发送,并能返回给定请求的response。该功能可由开发者实现

3.TransPort结构体,http库内部实现的RoundTripper接口,使用request,reponse,persistConn结构体方法,与远程服务器完成数据交互,完成http请求.(涉及到persistConn连接池)

4.persistConn结构体,tcp连接,发送与接收http协议内容数据,完成与http服务器端的数据交互

http发送代码示例

我先简单贴一下http发送的使用方法:

设置request请求

req, err := http.NewRequest("PUT", "http://www.baidu.com", nil)
if err != nil {
   fmt.Print("设置Request结构体出错:" + err.Error())
   return
}
req.Header.Add("Authorization", "xxxxxxx") //设置header头

发送request:

client := http.Client{
   Timeout:   3 * time.Second,       //设置超时时间
   Transport: http.DefaultTransport, //设置传输工具,可以使用默认工具
} //设置超时时间
resp, err := client.Do(req) //执行http发送,得到Response结构体
if err != nil {
   fmt.Println("数据发送出错:", err.Error())
   return
}
fmt.Println(resp.Status) //打印部分结果

http库发送模块

http发送模块图如下:

上面http发送流程图,只有一个简要的大体流程,有很多细节没有描述处理,将次要细节隐藏了,只保留了主要流程.下面根据发送流程,简要的解释一下各流程的作用.

发送流程简介

根据http发送模块图,简要的介绍一下各个过程的作用

①调用client.Do(req),启动http发送功能,使用Transport结构体中RoundTrip()方法完成发送功能

② 获取persistConn连接(复用的连接或者新生成连接),该连接为TCP连接,可以发送和接收http协议数据,于服务器端完成交互.

③启动两个协程readLoop协程和writeLoop协程(暂且以此命名,便于描述),启动协程如下:

go pconn.readLoop() //等待从http服务器端读取数据
go pconn.writeLoop() //等待向http服务器发送http协议数据

数据的传递由channel实现,连接的roundTrip()方法,向writeLoop()协程发送数据,启动writeLoop向http服务器发送数据功能

writeLoop协程发送完成以后,通过channel向readLoop协程发送数据,激活向服务器读取http协议数据功能

readLoop协程数据读取完成,通过channel将数据返回给等待数据的roundTrip方法

persistConn连接的复用,其中指的就是writeLoop协程和readLoop()协程循环发送和接收数据,每个下图流程就是一次http请求发送和接收

数据流动如下,使用channel发送数据:

④通过channel,将request结构体数据传入到writeLoop协程,writeLoop协程使用request的http协议封装方法,获取http数据,将数据传入到http服务器

⑤调用Request结构体的write方法,封装http协议,将数据发送到http服务器,其中数据发送设置的缓冲区大小为32k

⑥数据发送完成,通知readLoop协程读取http服务器响应数据

⑦调用response文件中的ReadResponse()函数,传入服务器响应io,解析http响应数据,设置Response结构体

⑧将设置完成的Response结构体返回

⑨通过channel,将生成的Response结构体从readLoop协程传送到http主协程(roundTrip方法中)

⑩将response结构体返回到client中,http发送完成.

golang net/http包部分实现原理详解 net/http包在编写golang web应用中有很重要的作用,它主要提供了基于HTTP协议进行工作的client实现和server实现,可用于编写HTTP服务端和客户端。 其使用方法也跟其他面向对象语言很相似,我们可以先从它的一些基础用法来感受一下: 以下是示例客户端代码: // 用http包中默认的Client进行请求(因为没有指定Client) resp, err := http.Get(... 阅读详情

相关推荐

Go的http包详解

前面小节介绍了Go怎么样实现了Web工作模式的一个流程,这一小节,我们将详细地解剖一下http包,看它到底是怎样实现整个过程的。Go的http有两个核心功能:Conn、ServeMuxConn的goroutine与我们一般编写的http服务器不同, Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。这是

yh_android的专栏 900

Go 中的 HTTP 资源泄漏之谜

我喜欢排查泄露的问题。这是一个智力之谜,我总能在这个过程中学到新东西。这个谜就像你在电视上读到或看的一样:细节是猥琐的,从不令人沮丧,最后,我们总能得到一个很好的合乎逻辑的解释。这就是计算机的伟大之处:它们最终是可以预测的,所以我可以安全地扮演侦探角色,因为我知道我总是能得到我的罪犯。如果你讨厌推理小说或者只想学习参考,你可以跳到关键要点(剧透警告,咄?)。泄露 Dogfood在 Coder,我们...

Go中国 747

kali破解WIFI密码

今天我们来学习一下通过kali和一个好的字典来破解WIFI密码。 声明:此教程仅供学习研究使用,严禁使用此技术进行非法行为 首先我们需要一个具有监听功能的无线网卡(这里我给大家推荐:rt3070) 本章实验通过虚拟机VMware进行: 先通过services.msc来打开VMware USB Arbitration Service 插上监听网卡,连接USB到虚...

#的博客 5810

Go 语言编程 — net/http — HTTP 客户端

目录 文章目录目录net/http net/http

烟云的计算 4504

AIPex:AI + 自然语言驱动的浏览器自动化扩展

AIPex是一款革命性的Chrome扩展,通过AI技术实现自然语言驱动的浏览器自动化。它支持30多种自动化工具,包括智能标签页管理(分组、切换、批量操作)、页面内容提取(文本、链接、元数据)、交互元素操作(点击、滚动)以及表单智能填写等功能。用户只需用自然语言下达指令,即可快速完成复杂的浏览器操作,大幅提升工作效率。AIPex特别适合需要处理大量重复性网页操作的用户,如数据分析师、产品经理等。

blues_C的博客 1127

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

net-http-transport 引发的句柄数(协程)泄漏问题

这篇文章主要讲述了一个负责告警规则判断的服务vmAlert出现句柄数泄漏问题。经过排查,发现是心跳接口的HTTP请求未正确处理响应体导致。未读取和关闭响应体会影响TCP连接复用,进而造成大量close_wait连接和句柄泄漏。通过分析代码和相关机制,找到了问题根因并进行了修复和测试。

-happy 的博客 1318

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

HTTP协议与sockt读取http包

很好的http介绍:) 一、超文本传输协议及HTTP包 HTTP协议用于在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包。HTTP协议使用可靠的TCP连接,默认端口是80。HTTP的第一个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1。HTT...

fishermen 375

机器人全局路线规划导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对全局路线规划导读做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1504

华为OD技术面真题 - Python开发 - 2

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 910

Golang解决高并发情况下,HttpClient请求失败的问题

而且这些问题是很难去排查的,比如我最近遇到的这个BUG,在大规模高并发的生产环境下,排查日志会发现极少数的请求会失败,报错如下图所示,这是什么原因呢?总结只需要设置req.Close=true就可以解决这个BUG,虽然很简单,但是它背后所带来的高并发问题还是值得我们学习的,让我对高并发有了更深的理解。它会阻止连接被重用,可以有效的防止这个问题,也就是Http的短连接。经过排查我发现,造成问题的最可能原因是服务器正在关闭连接的时候又接收到新的请求,所以这个请求就被服务器拒绝而失败。...

小陈工的博客 3047

Android16 动态隐藏systemUI右侧音量条

本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。

tzj1058756809的博客 779

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

总之,本文探讨了在 Golang 中并发发送 HTTP 请求的各种方法,这是优化 Web 应用程序的一项关键技能。我们已经讨论了基本的 goroutine、sync.WaitGroup、通道、工作池以及限制 goroutine 的方法。每种方法都有其独特的特点,可以根据特定的应用要求进行选择。此外,本文还强调了并发 Go 程序中错误处理的重要性。管理并发环境中的错误可能具有挑战性,但对于构建健壮的应用程序至关重要。

m0_68662723的博客 8973

AutoSAR系列讲解 - 前言

博主xyfx是一名汽车行业的嵌入式软件工程师,本职工作是同步电机的驱动控制(主要做FOC的,这个大家要是有兴趣,以后可以单独开一个专栏来讲解一下),由于做控制器的时候需要用到AutoSAR,所以特意的去学习了相关知识,同时博主自己也在同步提高中,有写的不合理的地方也请大家指正。我准备对AutoSAR开设两个大的方面来讲解,一是AutoSAR的入门篇,二是AutoSAR的实践篇,分别讲述AutoSAR的理论基础和工具的使用。

雪云飞星的博客 4万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

golang 中的http包详解

RESTful,是目前最为流行的一种互联网软件架构。URI表示一个资源,表现层用html、json、xml等格式输出,客户端和服务器互动http协议里的Get ,Post,Put等方法分别对应不同的操作。restful架构图: 首先来看看request和response的header中有哪些内容:requestHeader 解释 示例 Accept 指定客户端能够接收的内容类型 Acce

yuwenqi123456的博客 9172

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Golang发送HTTP请求

Golang发送HTTP请求 import ( "bytes" "encoding/json" "errors" "io" "io/ioutil" "net/http" "github.com/golang/glog" ) // AuthResp 授权码返回结构 type AuthResp struct { Token string `json:"token"` } // GetAuthHeader 获取auth header func GetAuthHeader() (header

聚沙成塔 6706

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

golang语言发送json格式的http请求

1. 发送普通的GET请求 func testGet() { url := "https://baidu.com" req, err := http.NewRequest("GET", url, nil) client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) ...

boss2967的博客 4200

Go For Web:Golang http 包详解(源码剖析)

在之前我们 使用的时候,其实内部是调用了 http 包默认的路由器也就是,通过这个路由器把本次请求的信息传递到了后端的处理函数。那么这个路由器是怎么实现的呢?结构如下:首先是一个 自定义类型结构体 ServeMux 其中包含一个锁和一个路由规则路由规则中一个 string 对应一个 mux 实体,我们来看看 muxEntry 它也是一个自定义类型结构体,包含一个 布尔值,一个Handler 处理函数最后再来看看 Handler 的定义,它其实是一个接口,实现了ServeHTTP这个函数。

Mercury_cc的博客 606

【Go入门】 Go的http包详解

我们前面小节讲述conn.server的时候,其实内部是调用了http包默认的路由器,通过路由器把本次请求的信息传递到了后端的处理函数。那么这个路由器是怎么实现的呢?mu sync.RWMutex //锁,由于请求涉及到并发处理,因此这里需要一个锁机制m map[string]muxEntry // 路由规则,一个string对应一个mux实体,这里的string就是注册的路由表达式hosts bool // 是否在任意的规则中带有host信息下面看一下muxEntry。

QAQterrible的博客 1770

一篇文章解决go的net/http包

将上面的代码保存之后编译成可执行文件,执行之后就能在终端打印example.com网站首页的内容了,我们的浏览器其实就是一个发送和接收HTTP协议数据的客户端,我们平时通过浏览器访问网页其实就是从网站的服务器接收HTTP数据,然后浏览器会按照HTML、CSS等规则将网页渲染展示出来。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。net/http 包提供了多种方法来发送 HTTP 请求,比如 http.Get、http.Post等 详细见下文 3.基本的HTTP/HTTPS请求。

MCM0115的博客 1346

使用Go发送HTTP POST请求

函数创建了一个POST请求,指定了请求的URL。接下来,我们设置了请求头的内容类型为JSON,并创建了一个包含请求数据的字节缓冲区。我们将缓冲区作为请求体,并设置了请求体的长度。以下是一个简单的示例,展示了如何使用Go发送HTTP POST请求并获取响应。类型的客户端对象,它用于发送HTTP请求。// 创建一个包含请求数据的字节缓冲区。函数读取响应体的内容,并将其打印出来。// 创建一个HTTP客户端。// 创建一个POST请求。// 设置请求头(可选)// 发送请求并获取响应。// 读取响应体内容。

weixin_73725158的博客 1758

Go语言中的net/http包

net/http包是 Go 语言中用于处理 HTTP 协议的标准库。HTTP 服务器:可以轻松创建一个 HTTP 服务器,处理来自客户端的请求。HTTP 客户端:可以发起 HTTP 请求,与外部服务进行交互。路由管理:支持基于路径、方法等条件的路由匹配。中间件:可以通过中间件扩展服务器的功能,如日志记录、认证等。文件服务:可以方便地提供静态文件服务。错误处理:提供了统一的错误处理机制,确保应用程序的健壮性。

软件架构师笔记 1414

Golang http之client源码详解

http客户端介绍 http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。本文章主要介绍Golang中http客户端的相关源码,源码主要在net/http/client.go中。源码版本号为1.10.3 一个简单的http 客户端请求例子: package main import ( "log" "fmt"...

skh2015java的博客 5980
上一篇: 代码优化之局部性设计(提高对缓存的命中率)
下一篇: HTTP跨域问题的解决方案
Star_CSU
博客等级 码龄10年 10粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值