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

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

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

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

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

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

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

Client结构体

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

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

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

Request结构体

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

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

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

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

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

准备发送请求

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
Top