当前位置:首页 > 科技  > 软件

图文讲透Golang标准库 net/http实现原理 - 客户端

来源: 责编: 时间:2024-02-05 09:31:07 304观看
导读客户端的内容将是如何发送请求和接收响应,走完客户端就把整个流程就完整的串联起来了!这次我把调用的核心方法和流程走读的函数也贴出来,这样看应该更有逻辑感,重要部分用红色标记了一下,可以着重看下。图片先了解下核心数

客户端的内容将是如何发送请求和接收响应,走完客户端就把整个流程就完整的串联起来了!gFn28资讯网——每日最新资讯28at.com

这次我把调用的核心方法和流程走读的函数也贴出来,这样看应该更有逻辑感,重要部分用红色标记了一下,可以着重看下。gFn28资讯网——每日最新资讯28at.com

图片图片gFn28资讯网——每日最新资讯28at.com

先了解下核心数据结构Client和Request。gFn28资讯网——每日最新资讯28at.com

Client结构体

type Client struct {     Transport RoundTripper     CheckRedirect func(req *Request, via []*Request) error     Jar CookieJar     Timeout time.Duration}

四个字段分别是:gFn28资讯网——每日最新资讯28at.com

  • • Transport:表示 HTTP 事务,用于处理客户端的请求连接并等待服务端的响应;
  • • CheckRedirect:处理重定向的策略
  • • Jar:管理和存储请求中的 cookie
  • • Timeout:超时设置

Request结构体

Request字段较多,这里就列举一下常见的一些字段gFn28资讯网——每日最新资讯28at.com

type Request struct {    Method string    URL *url.URL    Header Header    Body io.ReadCloser    Host string    Response *Response    ...}
  • • Method:指定的HTTP方法(GET、POST、PUT等)
  • • URL:请求路径
  • • Header:请求头
  • • Body:请求体
  • • Host:服务器主机
  • • Response:响应参数

构造请求

var DefaultClient = &Client{}func Get(url string) (resp *Response, err error) {    return DefaultClient.Get(url)}

示例HTTP 的 Get方法会调用到 DefaultClient 的 Get 方法,,然后调用到 Client 的 Get 方法。gFn28资讯网——每日最新资讯28at.com

DefaultClient 是 Client 的一个空实例(跟DefaultServeMux有点子相似)gFn28资讯网——每日最新资讯28at.com

图片图片gFn28资讯网——每日最新资讯28at.com

Client.GetgFn28资讯网——每日最新资讯28at.com

func (c *Client) Get(url string) (resp *Response, err error) {    req, err := NewRequest("GET", url, nil)    if err != nil {        return nil, err    }    return c.Do(req)}func NewRequest(method, url string, body io.Reader) (*Request, error) {    return NewRequestWithContext(context.Background(), method, url, body)}

Client.Get() 根据用户的入参,请求参数 NewRequest使用上下文包装NewRequestWithContext ,接着通过 Client.Do 方法,处理这个请求。gFn28资讯网——每日最新资讯28at.com

NewRequestWithContextgFn28资讯网——每日最新资讯28at.com

func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) {    ...    // 解析url    u, err := urlpkg.Parse(url)    ...    rc, ok := body.(io.ReadCloser)    if !ok && body != nil {        rc = ioutil.NopCloser(body)    }     u.Host = removeEmptyPort(u.Host)    req := &Request{        ctx:        ctx,        Method:     method,        URL:        u,        Proto:      "HTTP/1.1",        ProtoMajor: 1,        ProtoMinor: 1,        Header:     make(Header),        Body:       rc,        Host:       u.Host,    }     ...    return req, nil}

NewRequestWithContext 函数主要是功能是将请求封装成一个 Request 结构体并返回,这个结构体的名称是req。gFn28资讯网——每日最新资讯28at.com

准备发送请求

构造好的Request结构req,会传入c.Do()方法。gFn28资讯网——每日最新资讯28at.com

我们看下发送请求过程调用了哪些方法,用下图表示下gFn28资讯网——每日最新资讯28at.com

图片图片gFn28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-73789-0.html图文讲透Golang标准库 net/http实现原理 - 客户端

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python协程的实现方式

下一篇: NextTick 在 Vue 中如何发挥作用的?其实大部分人一知半解

标签:
  • 热门焦点
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从“最美JK”起到“最美女星&r
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
Top