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

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

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

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

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

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

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

Client结构体

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

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

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

Request结构体

Request字段较多,这里就列举一下常见的一些字段9No28资讯网——每日最新资讯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 方法。9No28资讯网——每日最新资讯28at.com

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

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

Client.Get9No28资讯网——每日最新资讯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 方法,处理这个请求。9No28资讯网——每日最新资讯28at.com

NewRequestWithContext9No28资讯网——每日最新资讯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。9No28资讯网——每日最新资讯28at.com

准备发送请求

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top