大家好,我是阿云,今天跟大家分享一下怎么实现 http 请求。首先我们在编程指南中打开 esp http 客户端这一章节, 他这里默认我们是上过网的,都知道什么是 http, 所以 他直接开始教我们怎么使用这个主键。 然后下面就给出我们这期要学习的誓利,这个誓利里还包含了 http s, 但我们先不管先学会怎么发送 http 请求,现在我们来创建这个誓利,这次创建成功后,先不要急着构建项目,待会再给大家进行说明。 ok, 创建成功,我们先到主函数中看一下,这里有一个叫 example connect 的 函数,顾名思义,它这是专门用来给市利用的联网功能,它把 wifi 连接和以太网连接都浓缩在这一个函数中,这非常方便我们用来做测试。 那我们在正式的产品中不能使用这个函数,因为他没有提供回调函数,让我们去处理成功或失败的情况。 ok, 现在我们要给他配置 wifi 名和密码,我们需要在 menu config 中进行配置。 进入到这个界面以后,我们点击一下左侧的 example configuration, 然后在右侧就可以看到 wifi 名和密码,我们来对它们进行修改, 修改完后点击一下上面的保存按钮,然后就可以开始构建项目。然后我们回到编程指南,这里提到如果要了解 http 基本请求,可以看这两个函数, 我们可以大概浏览一下这两个函数的代码, 总体看下来它们的区别其实不大,我们只需要看其中一个函数即可。 刚好项目构建完成,我们可以来过一遍代码。首先我们来到主函数,我们先看这一段代码, 我们在上一期已经学习过,所以不用讲,我们直接往下看。 sample connect 函数我们一开始已经做了介绍,这里不再赘述。以上的步骤就是为了连接网络, 为后面的 http 请求做准备。我们接着往下看,这行代码不会被执行到,我们直接把它删掉, ok, 最后剩下创建任务,我们跳转过去看看这个任务,可以看到前两个函数就是编程指南里面提到过的, 然后我们看到下面还有很多个类似的函数。从函数名我们可以推测出这是根据不同场景的 http 客户端使用方法,但我们这次只需要学最基础的用法,所以可以把它们删掉。 而剩下的这两个函数没有太大的差别,我们只需要学习第一个, ok, 现在我们可以把用不到的函数定义也删掉。 这个 http 页面 handle 是 回调函数,后面我们会用到,不能删, 删除到这个地方就可以。 ok, 剩下要看的内容就不多了,我们接着往下看。 由于市力中的 http 请求是一次性的任务,所以要在任务的最后调用 v t s 指令函数来删除任务,否则系统会报错。这个涉及到非 r t o s 的 底层机制,暂时不作深究。接下来我们就进入到 http 基本请求的函数中学习。 首先是定义一个制服宿主,这个宿主用来接受请求反馈的数据,数据的容量最大为二零四八,后面加一是留给结束符, 然后下面就开始配置 http 客户端,我们看一下这个结构体的参数。 host 用来填服务器的域名或者 ip 地址,我们先把这个红定义的值复制出来,方便我们做后续的修改,然后我们可以把这个域名复制到浏览器上,看看这是个什么样的网站。 这是给我们用来做测试的网站,下面有很多接口,我们可以点击展开来看看, 这里每一行都是一个接口,这里每个接口就等于一个 url, 然后左边的设块代表的是 http 请求的方法,这个方法没什么需要深究的,服务器要求我们填什么方法,我们就在客户端配置什么方法。 我们回到代码看第二个参数, path, 这里填的是斜杠 get 对 应的就是这一个接口, 我们可以在网站上直接测试这个接口。首先点击 try out, 然后点击 execute, 下面就会有这个接口的返回结果, 这一段 url 就是 我们实际请求时的接口。对于 get 方法的接口,我们还可以在浏览器上直接打开,这里的内容跟刚刚测试的结果是一样的。 而其他方法的接口是不能直接在浏览器上打开的,例如这个 post 方法的接口,因为浏览器默认是使用 get 方法来打开网站, 这里的提示就是我们不能用 get 方法来请求这个 post 接口。在适利代码中,客户端默认是 get 方法,后面我们会看到它怎么配置成 post 方法。 接下来我们看第三个参数,这里填写的是 url, 后面的参数,一般是配合 get 方法来使用,我用一开始的 get 接口来演示一下,在这个链接后面加上问号就可以开始填写参数, 可以看到我们成功把 esp 这个参数传给了服务器,我们还可以给他加一些别的参数,等于号后面填的是参数的值 与符号,用来添加新的参数。我这里加了 f, f f 作为新参数,可以看到服务器都能够识别出来,并且返回给我。 我们回到代码,用这三个参数来配置一个链接其实是不太方便的,我更推荐用 url 这个参数,把完整的链接复制粘贴到这个参数即可,这样写更直观更方便。我们测试上面这三个参数就可以删掉。 如果我们要换一个接口测试,我们可以直接修改链接后面的部分, 例如我要换这个 headless 接口,我就直接修改这一部分。 ok, 接着我们看下一个参数, event handle, 这个用来配置回调函数,我们已经接触过不同的回调函数,大概能拆出它的代码结构,根据不同的事件进行不同的处理。 我们最后再来看它的代码。下一个参数, user data, 这里配置一开始的制服宿主,意思就是用它来接收服务器返回的结果。最后一个是禁用自动重定向,这个可以不用了解,直接用它的默认配置即可。 配置完后,调用这个 perform 函数就可以执行 http 请求,然后根据返回的结果打印成功或失败。最后再用这个函数以十六帧制的形式打印服务器返回的内容。 实际上我们也可以用制复创的形式打印结果,我们改一下这个 log i 函数就能够打印。 ok, 我 们接着往下看下面这一段代码演示怎么发送 post 请求? pos 方法传递参数的方式跟 get 方法不一样,一般会先把数据整理成 pos data 这样的格式, 我们称这种格式为追审格式,然后要调用这个函数,告诉服务器我们要传追审数据,然后通过这个函数给客户端配置要发送的追审数据,最后也是通过 form 函数来执行请求。 上面还有两个函数, set url, set method, 从名字我们就可以知道,一个是配置 url, 一个是配置请求方法。 ok, post 请求也已经讲完, get 和 post 是 http 中最常用的方法,其他方法我们可以不学,那么我们直接把下面的方法删掉。 ok, 现在只剩下一行代码, pick up 这个函数用来清除客户端,关闭链接,避免内存泄露到这里, http 客户端的工作流程就结束了。最后我们再来看看回调函数, 这里很多事件我们都不用管,最重要是 on data 这个事件,服务器返回的数据怎么放,放在哪里,就是在这里进行处理的。 首先第一步是把 user data 清空, user data 就是 我们在客户端配置时的制服宿主, 接下来用 if 条件判断服务器返回的是不是流逝数据。什么是流逝数据?我们跟 ai 对 话的时候,它是逐字逐字的给我们返回信息,像水一样不断的流出来,那种就是流逝数据,如果它是所有内容一次性返回,那么它就不是流逝数据。 这期我们只看怎么处理非流式的数据。首先他判断一下有没有配置 user data, 显然我们是有配置的,所以下面 else 一 部分的代码不会被执行到,可以删掉。剩下最关键的就是这几行代码, 简单概括一下,就是把 data 中临时存放的请求结果转移到 user data 中,而上面这行代码是为了保证接收的数据不会超出制服数组,在接收少量数据的时候,这个事件只会触发一次。 当传输大量数据的时候,网络底层会自动把数据拆分成多个数据包,这时候 on data 事件就会被触发多次,所以最后会用 output length 加等于 copy length 来记录接收的长度。 当数据接收完成,就会触发 on finish 事件。这里的 output buffer 在 on data 的 时候已经被我们删掉,所以我们也可以把这几行代码删除。 当 http 链接断开的时候,就会触发 disconnected 事件。下面这里有一个函数,它的名字里包含 tls, tls 是 一种安全协议,这跟 https 相关,我们这期不学可以把它删掉, 剩下的 app buffer 也可以删掉,下面只剩下重定向事件,我们不用管,这个 app buffer 定义也已经没有用了,可以删掉。 到此我们就讲完了视力的代码,接下来我们就跑一下代码,看有没有问题。构建项目 构建成功,烧录烧录成功,监视设备 可以看到 get 请求成功,然后打印十六定制的数据,再打印制服创数据 post 请求也打印出成功信息。 代码没有问题,接下来我们就把它整合到我们自己的项目中,记得要关闭监视设备。接下来我们把整份代码复制到自己的项目中, 然后修改 c mac 的 配置。视力项目的配置稍微要复杂一点,但我们只要认准它的关键字,就能知道哪些是主键依赖或者熟练的我们就可以直接看出这些就是主键名 esp tls 主键跟 http 相关,我们暂时不用,然后 mvs flash 我 们已经配置过了,所以也不用复制。 esp 页面应该是跟 http 事件相关,我们复制过去,然后 let if 主键我们可以不复制过去,因为我们在上一期已经跑通过相关的函数,估计 wifi 主键已经把它配置成公共依赖, 最后就剩下 http 客户端,显然这个是最重要的,主键必须复制。 ok, 最后再配置一下 c 文件, 接下来我们再修改一下代码文件。首先我们来到 app 魅函数,这一段代码我们已经在戳死化 wifi 的 时候执行过,这里不再需要执行,可以删掉。 而这个 s sample connect 功能我们已经有正式的 wifi 连接功能代替,所以也可以删掉。最后只剩下创建任务这一行代码,然后再修改一下函数名。 最后再看看哪些头文件是不需要的,这两个头文件带有 sample, 明显是跟 sample connect 功能相关,可以删掉。 然后这两个头文件是跟 http 相关的,也可以删掉。然后再来看下面这两个变量,他们的变量名都带有 ssl, ssl 是 一种安全协议,也跟 http 相关,所以又可以删掉。修改完成,现在我们构建项目试试, 构建出错,我们跳转过去看看,这个红没有定义,我们把域名复制过去即可。 ok, 我 们再来构建项目,构建成功代码没有问题。接下来我们配合 lvgl 来发送一次 http 请求,我们可以在界面上添加一个按钮,再通过按钮去触发这个功能。 首先在 ui 文件声明外部函数,然后再添加按钮控件,按钮控件的代码我们可以在 lvgl 的 第二个官方势力中找到 复制过来,然后稍微修改一下就能使用。 可以改一下按钮的名字,也就是这个 label 中的制服串。这个 label 的 变量名最好也改一下,要和全局的 label 做区分,我这里是忘记修改。接下来我们把 http test 函数放到回调函数中即可。 ok, 接下来我们就把结果显示在全区 label 上,这次又需要用到 set my label 这个函数,我们把它引入到 http 的 功能文件中, 然后把 local respawn buffer 这个变量传进去即可。 post 请求结果,我们也让它显示出来。 ok, 我 们开始进入测试阶段,首先构建项目 构建成功,烧录程序 烧录成功,现在我们来测试一下。我们来点击屏幕上的 http 按钮, 可以看到出现了两次信息,这证明了 http 请求正常整合功能成功。本期的视频就到这里,感谢各位观看。
粉丝671获赞3155

我们将通过发送 http 请求来获得网页内容。 http 是 hypertext transfer protocol 的缩写,意思是超文本传输协议。 他是一种客户端和服务器之间的请求响应协议。比如说浏览器就可以被看作客户端。当我们在浏览器地址栏输入想访问的网址,按下回车后,浏览器就会向该网站的服务器发送一个请求,然后等待服务器返回给浏览器响应。 h t t p。 实际上有不同的请求方法,最常见的两种是 get 和 post。 get 主要用于获得数据, post 主要用于创建数据。比如说我们进入一个网页,浏览器会发送 get 请求,得到网页内容。当我们提交账号注册表单时,浏览器会发送 pose 请求,把你的用户名、密码等信息放到请求主体里给到服务器。由于爬成程序基本上是在获得数据,所以我们发送到请求。大部分情况下用 get 方法。除了方法类型,一个完整的 http 请求例子长这样, 他呢由三部分组成,请求行、请求头、请求体。请求行会包含方法类型、资源路径和协议版本。 资源路径指明了你要访问服务器的哪个资源。比如下面这个网址里,第一个斜杠表示资源路径的根,所以根后面的 movie top 二百五十就是要访问的资源的路径。 有时候除了资源路径,我们还可以在这里给出查询参数,比如说下面这个网址里问号后面的就是查询参数,可以传递给服务 起额外的信息,不同信息之间用 and 符号风格,比如通过 story 的参数等于七十五,豆瓣的服务器就知道, ok, 咱们返回给用户的页面,内容从排在第七十五的电影开始往后展示。 请求行里的最后一项是协议版本,指的是 http 协议的版本,比如 http 一点零、 http 一点一等。请求头会包含一些给服务器的信息,比如 host、 user agent、 accept 等等。 host 指主机域名,主机域名结合请求行里的路径资源,可以得到一个完整的网址。斜杠前的这部分是域名,斜杠后的是路径问号,后的是查询参数。 user agent 呢,用来告知服务器客户端的相关信息,比如请求是浏览器发出来的还是 其他东西发出来的,如果是浏览器的话,类型是什么,版本是什么等等。 accept 是在告诉服务器客户端想接收响应数据是什么类型的,接收多种类型的话,可以用逗号进行分割。如果是星号斜杠,星号表示啥类型都行。 最后,请求题里面可以放客户端传给服务器的其他任意数据,但是 get 方法的请求题一般是空的, 那在服务器接收到 http 请求后,他会根据所有这些信息返回 http 响应。 响应也由三个部分组成,状态行、响应头、响应体。状态行包含了协议版本、状态码、状态消息。协议版本咱们前面讲请求的时候提过,可以是比如 hdp。 一点一,状态码和状态消息则是对应的, 常见的状态码和状态消息有这些,二开头的表示成功,请求已经完成处理。三开头的表示重定向,需要进一步的操作。四开头的表示客户端错误,比如请求里面有错误或请求的资源无效等等。五开头的表示服务器错误, 比如出现问题或正在维护。我们在不小心输入错误的网址后,一般会来到一个展示四零四的页面,这个四零四就是 http 状态码。 响应头会包含一些告知客户端的信息,比如 date 生成响应的日期和时间。 content type, 返回内容的类型及编码格式, 比如 text h t m l 叉儿 set 等于 u t f 杠八,说明类型是 h t m l, 编码是 u t f。 八、最后呢,响应题里面就是服务器 想给客户端的数据内容,比如如果前面说内容类型是 h t m l, 这里就应该是 h t m l 内容。我后续会对 h t m l 进行讲解,现在先知道他大概长这样就行了。里头有非常多的间括号, 但我们要如何通过拍档就构建和发送一个 http 请求呢?又要如何获得 http 响应呢?请见下回分界,我们下个视频见。

我就先问点基础的内容啊,打开一个浏览器,输一个网址,再回车打开一个网页,这个过程中发生了什么呢?嗯,用户输入网址并按下回车键,首先肯定是浏览器会将输入的网址 url 通过 dns 翻译成对应的 ip 地址, 然后呢,浏览器使用获取到 ip 地址,建立 tcp, 连接至目标服务器,之后浏览器发送 http 请求至目标服务器,然后请求特定的网页内容。 当目标服务器接受到请求以后,处理并返回相应的 html 文件和其他的相关资源, 比如呃,图片,样式表,脚本等。然后浏览器接收到返回的内容,解析 html 文件并下载其他相关的资源,然后最后才是。嗯,浏览器根据 html 文件和相关的资源上传网页的矢图,并展示给用户,大概就是这样的一个过程。 嗯,那中间的 dns 的 解析过程又是怎么样的呢?嗯,简单的说就是输一个网址要先查本地路由器和电脑的缓存的记录,找不到就向本地的 dns 服务器找,找不到就找根域名服务器, 还是找不到就找顶级域名服务器,最后获取服务器的 ip 地址,一旦电脑接受到这些 ip 信息等,然后就缓存下来,最后返回网站的网页和资源,然后这就是一个整个的解析的过程。

你以为浏览器并发请求越多,网页加载越快?错了!限制同域名并发请求数,其实是浏览器保护服务器和网页的关键设计哦。 当你打开网页时,浏览器会向服务器请求图片、 cssjjs 等各类资源。为了避免同一域名下同时发送过多请求,浏览器会设置一个上限。比如 chrome 通常允许六个并发请求。 这就像餐厅限制同时进店的人数,防止厨房忙不过来,导致所有客人等待。需要注意的是,这个限制仅针对同一域名,不同域名的请求互不影响。比如百度和淘宝的请求数是分开计算的, 服务器处理请求需要消耗 cpu、 内存和贷款等资源。如果同一域名同时涌入几十上百个请求,服务器很可能会崩溃或响应变慢。这就像一家小店同时接待一百位顾客,每个都要服务,结果谁都要等很久。浏览器限制并发症是行业共识的保护机制,避免单个用户的浏览器压垮服务器, 从而保证多数用户能够正常访问网络。宽带如同公路,同一时间车太多就会堵车。如果浏览器不限制并发请求,同一域名的请求会占满用户的宽带,导致其他请求,比如其他网站会页面关键资源的加载变慢, 比如家里的 wifi, 同时在看视频、下载文件、刷网页,所有操作都会变得卡顿。限制并发能够让资源分配更加合理,确保 js、 脚本等关键资源优先加载,从而提升页面的整体体验。 浏览器本身也是一个程序,每个请求都需要占用内存、 cpu 和内存。如果同时有上百个请求,浏览器的性能会下降,甚至卡顿崩溃。这就像手机同时打开二十个 app, 后台运行会导致发热变慢。虽然浏览器限制并发症,但可以通过 keepalive 技术附用 tcp 连接,减少重复建立连接的开销。 比如去咖啡店买咖啡,第一次需要排队点单付款之后就可以直接用之前的订单信息快速取餐,不用重新排队。连接附用让浏览器在限制病发的同时提高了请求效率,避免了频繁三次握手带来的延迟。 不同浏览器的病发现值数值有所不同, chrome 和 firefox 通常是六个, safari 可能是四个。这并不是统一的标准,而是各浏览器根据自身优化策略平衡的结果。 比如不同品牌的餐厅,有的允许五人同时进入,有的允许六人,但都是为了保证服务质量,开发者无需过度纠结这些差异。多数场景下,六个并发已经足够。如果页面需要加载大量资源,比如电商网站的商品图片,可以将资源放在不同的子域名下, 比如 img 幺点 e x a m p l e 点 com。 img 二点, e x a m p l e 点 com。 浏览器会把每个子域名当做不同的域名,并发请求数可以叠加。这就像商场里一家店只能近六人,但旁边的分店可以同时接待, 从而提高效率。不过不要分太多子域名,否则会增加 d n s 解析的开销,反而影响性能。即使没有浏览器的限制,过度并发也会带来问题。服务器可能返回五零三错误, 网络拥堵导致请求超时,甚至 isp 会认为是恶意流量而限制待宽,这就像一次性给朋友发一百条消息,朋友可能会忽略大部分或者手机卡顿。开发者应该合理规划资源加载顺序,优先加载关键资源,而不是依赖无限并发。 浏览器的病发限制通常在四到八个之间,这是长期实践平衡的结果。如果限制太少,比如一个页面加载会极慢,如果太多,比如二十个,会导致服务器和网络压力过大。这就像电梯载重,一千千克刚好容纳十人左右,既不浪费空间也不超载。


我们来直接写代码第一步,哎啊,发送请求,发送请求的话他有两个基本的啊,有三个啊,三个基本的东西啊,三个基本的点就是你在这个第一部分代码的话写三个东西就行了,第一个是浏览器啊,模拟浏览器,第二个呢请求网址 啊,第三个点的话就是我们的发送请求啊,发送请求就三个玩意,像模拟浏览器的话我们是能够直接啊使用。 对啊,能够干嘛呢?可以通过开发者工具进行复制粘贴啊,进行复制粘贴,复制哪一个呢? 来我们看一下啊,就在这一个,我们不是找到了这个数据包吗?找到这个数据包之后的话呢,下面会有一个请求标头,当这个请求标头里面就是我们的一个参数内容, 看在这个请求标图里面啊,给大家看一看啊,这个请求标图里面啊,就是我们的一个什么模拟伪装的参数内容,就在这个里面, 那我们用的是什么呢?对啊,在这个里面的话我们要去复制哪些内容呢?它的参数的话我们可以直接复制过来啊,像它的 cookie 我们可以复制一份啊,把它的 cookie 还有呢?还有它的一个,呃 u a 拿过来啊,把它 cookie 复制过来,还有这个 user agent, 我们把这两个东西给它复制过来,放到代码里面。放到一个什么字典当中啊? 复制过来之后呢?放到字典里面啊,一个是 cookie 哎,直接给他拿过来,嗯,还有一个是什么呢?还有一个是我们的 user a 卷好长啊,好长。对,挺长的啊,因为他的话是表示你的用户信息啊,用户相关的一个信息数据,所以说他有会比较长啊, 有些的话可能会短一点,但是长的话无所谓啊,反正是复制粘贴的嘛,不需要你自己手工去打啊,但是你直接复制过来就行了。这个 cookie 的话是什么呢?啊?是我们的用户信息啊,常用于检测干嘛呢?是否有登录账号? 有登录账号啊,我们这个 u a 的话就是用户代理打这个 u a 啊, user age 就是我们的用户代理 表示浏览器或者说是设备的基本身份信息啊,我们用这两个的话就可以做一个简单伪装啊,为什么加这两个呢?首先第一个啊,啊,第一个的话我们要去模拟成什么呢?我们要去模拟成浏览器, 对,模拟浏览器的话,我们浏览器和设备相关的信息我肯定是要携带上的,像你的 windows 系统 win 十的对吧? win 六十四位的对不对? 还有相关的一个什么呢?你的电脑啊,就是你的浏览器的版本,看到没有啊?这是我们浏览器啊,谷歌浏览器,然后幺八幺二八的一个版本。对,这是最基本的一个信息啊,给他伪装过来说。伪装过来,为什么我们还要加这个用户信息呢? 对,为什么还要加这个 cookie 呢?短加这个 cookie 的原因是什么呢?因为像淘宝这个网站啊,就是你不加 cookie 的话,就你不登录账号,你是没办法获取到数据的。就有些啊,就某些网站干嘛呢?是需要登录账号之后才能啊,查看到数据内容 对像这种话,我们就可以干嘛呢啊?你如果说不做模拟登录啊,不实现模拟登录,那你可以干嘛呢啊?携带登录账号的一个 cookie 进行请求 哒,这样的话就可以了啊。加这两个就够了嘛啊加这两个就够了,如果说不够的话咱们再加其他的嘛,因为像 有些网站的话你只要加 uv 就可以了,有些网站的话你就啊 cookie 和 uv 都要加,那有些的话可能说加这两个不够。那伪装。如果说啊如果说我们加这两个东西就就伪装的话。 但嗯你你只是做了一个 cookie 和 uv 的话,在我们获取数据的时候你拿不到,或者说你得不到数据,或者说呃你得到数据不是想要的,那你再去加其他的,或者说再去进行呃进一步的一个分析,明白了吧。好吧,这个的话就是模拟浏览器啊,直接去复制就好了。 然后第二个啊第二个啊,我们的一个啊发送啊我们的请求网址。请求网址的话就是刚刚干嘛呢?刚刚啊,抓包找到的链接地址 领地址啊,你也给他复制过来就可以了啊。就哪个呢?就这个链接啊,很长这个链接也很长啊这个链接也很长。你也可以干嘛呢?直接给他 这样子复制过来也可以啊,也可以,对不对?然后复制干嘛呢?粘贴用个命令名接受 u l 等于什么呢?等于我们这个链接好发送请求的话啊。对啊,我们网址也给它复制过来了。那发送请求怎么去做呢? 发送请求的话我们一般情况啊。一般啊,一般情况使用的是第三方的一个模块,哪一个 request 用的是这个模块啊?用的是这个第三方的一个模块 request 去进行一个请求的,那这个的话它是第三方,首先第一个点你要去安装这个模块,要安装啊,安装我们这一个 request 的一个模块。 第二步,打安装之后的话,我们要去导入一下这个模块,就你安装了,你不导入的话,你是用不了它的方法的, 如果说你导入,但是你没有安装的话,你没有这个东西他也会报错,懂了吧?啊?首先得去安装啊,安装,安装好了之后的话,呃,安装的话怎么去安装啊?就文件啊, windows 文文件,加 r 键,输入 cmd, 点击确定, 然后输入安装的命令, pip 应自动 request 进行安装就好了啊,就这样。然后导入的话也比较简单啊,导入的话我们直接在代码里面导入就可以了, 导入数据请求的模块,用这个 input 关键字啊,进行一个导入,加上他的名字啊,导入我们这个模块名, ok 啊,导进来之后的话,我们去发送请求的话,还需要注意两个细节啊,还需要注意两个细节,第一个的话是他的一个请求方法,注意一下他的请求方法是什么?就是我们请求这个网站用要用什么样的方法去请求,然后其次的话就是他的一个请求参数是什么样子的, 对,请求方法的话,我们可以在什么呢?在这个地方看啊,哎,就这个地方,那我们这里不是有个常规吗?前面这里不是网址吗?网址下面的话,他这里就会告诉我们请求方法是什么,那这个话就是我们的请求方法。 对,这个东西方法就是 get, 对,那就说明什么呢?我们这个网站的话是一个 get 请求啊, get 请求,那请求参数呢?像 get 的一个请求的话,他会有一个呃查询参数啊,这个查询参数的话非常神奇啊,他查询参数的话是直接干嘛呢?在链接中显示的, 在链接中就有的,咱们的查询参数的话是直接在链接里面,就是哪一部分就是我们这个链接不是很长吗?特别长是吧?哪一段是他的一个查询参数呢?就是问号后面的这个内容, 打这个问号后面的这些就是属于他的一个查询参数。那就这个问号后面啊,这一部分的话都是啊,打这种 gsv 等于二点七二。对啊, appk 等于幺二五七七四七四四七八,对啊,这些的话就是他的一个查询参数 啊,像这种长比比较长的话,像这种情况啊,你可以直接请求啊,就有两种情况,第一个的话你可以干嘛呢啊?第一种啊,可以直接啊,通过 get 方法 请求我们的链接啊,直接请求啊,直接请求啊,第二种的话啊,第二种话干嘛呢?我们可以额外构建啊,可以额外构建一下我们的一个参与参数。 那什么意思呢啊?如果说直接请求的话怎么去写呢啊?直接请求的话就相当于啊 request 点上一个 get 请求 u l 等于什么呢? u l headers 等于 headers 啊,再用一个 response 变量去接收,这样子的啊,这样的话就直接对于我们这个王者去请求了,对这个的话就直接请求我们的王者啊啊,就这个方法,但是有点长啊,我感觉没必要加这么多, 这里的话我们就给短一点啊,大概的话是这个样子啊啊这是我们啊请求网直接请求的话大概就是这个样子的 啊大概就这样子立了吧啊如果说你要构建的话你要额外构建这个查询参数的话就相当于什么呢?我们问号链接就是哪个呢?链接问号和作战内容我们给他删掉我们重新用一个字典去接受。额外去构建一个什么呢?查询参数 咱们去额外构建一个查询参数啊,就给它分开写,用一个 data 但用个字典去解锁 它这个数据啊它参数在哪里?在这个窄盒里面可以复制的,这个的话就是它的参数给它复制过来,然后呢放到这里面啊再给它啊。呃加上我们的引号我们做一个批量替换啊做一个批量的一个替换把它构建成我们剑指队的一个形式 来替换, ok 啊。然后我们请求的话那这里的话是不是我们这个 u l 里面它是已经没有查询参数了啊?它里面是没有查询参数了,所以我们去请求的话就要在这里干嘛呢?多给他传一个查询参数。 performs 等于 data 啊就这么去写懂了没有啊那呃如果说你要 o i go 键的话就这样子去写啊。我们来个短一点的啊,这个太长了,给他 摆个短一点的啊。我就短一点啊。短一点别太长了,太长的话有点不太好看啊。就大概是这样的就额外构建的话就是这个样子的, 明白了吧。嗯啊这里可能不太好看啊,我们这样写吧对吧。直接请求链接 我们给他复制过来我们在这里写 啊这里话是直接请求链接,那如果说我们 o o y 啊,构建我们的一个常用参数 笔记,给你们写好,给你写好,这样子看的话更舒服一下,但那样子看的话太太那个了 呐, ok 啊啊,太多的话是太不太舒服啊,太多的话我感觉不是很舒服啊, 就就相当于这样子啊,就就大家了解一下就可以了。就是如果说啊比较多的话,你可以干嘛呢?可以给这样写啊,也可以啊,按照这种方式,这两个方式都可以啊,都可以,但是一般我如果说为了方便更方便传餐的话,我们一般会用这种,就长链接的话,就链接比较长,我们一般会写以这种写法,他会给他额外构建一个,这样写的话会更方便一些好不好? 好,那这就是我们第一步啊,这个的话就是第一步我们的一个呃,发送请求的基本代码内容啊,基本代码的话就这些啊,因为相关的东西的话他不是很复杂, 他不是很复杂,只要你能够啊,只要我们按照第一步你分析到了相关的数据位置之后,他起他里面的相应的参数内容啊,代码内容啊, 我们都是可以复制的,像我们的魔力浏览器啊,链接啊,参数啊都是复制的,然后方法是根据网站来上面来的,然后把这些参数的话直接传进去就好了。好,这样的话就第一步发送请求。

pason 爬虫教程第二章二点一 h t t p 请求与响应学 python 我 只看糯米哦,前面的几期视频呢?糯米已经带大家初步了解了爬虫原理以及相关知识。 我们知道 python 爬虫要获取网站的某项资源,可以简化为三步,第一步,模拟用户行为,向网站发送请求。 第二步,获取服务器的响应数据。第三步,提取数据并保存在本地。前面的课程我们只是大致了解了这些步骤,但是没有具体的解析爬虫是怎么模拟用户的,以及这个响应数据该如何查看获取。 其实说白了,这些请求和响应都是 http 协议里面的东西。这个 http 协议上节课糯米也讲了它是浏览器与服务器之间沟通的规矩,今天我们就详细拆解一下这个 http 协议,看一下它具体的工作流程。 宝宝们看这里糯米星用浏览器打开了百度网址,我们可以用右键选择最下面的检查选项,或者按住键盘上的 f 十二按钮,这样我们就可以进入到开发者工具页。接下来我们点击顶部的网络选项,如果宝宝们是英文的话,就点击 network 选项, 这时候浏览器会提示我们需要重新加载页面才能看到这些数据。我们点击这里的按钮或者按键盘的 f 五,刷新页面也能得到数据。 点击完后,你看这里哗啦啦一大堆数据代码都出现了,我们滑动鼠标滚轮往上查,找到这里的百度点 com, 在右侧标头这里,我们就能看到这次网页请求的相关数据了,里面包含了常规数据, response headers 以及 request headers, 这里的 request headers 就是 请求头, response headers 就是 响应头。不要小看了这两个东西哦,它里面包含了十分重要的数据,能确保用户浏览器与服务器正常的数据交互。当然我们也可以点击这里的原始按钮,查看一下它们的原始数据交互。当然我们也可以点击这里的原始按钮,查看一下它们的原始数据。 那这么些代码数据到底是什么意思呢?咱们一个个来看。当我们在给网站发送一个 http 请求时,就像在寄快递时候填写单子,上面记录了寄件人、收件人、寄件物品是什么。 http 请求也是如此,它由三部分组成,请求行、请求头和请求体。 糯米在这里重新访问一下百度页面,并且搜索 python 相关数据,同时把这里的原始请求头数据复制一下,放在这边,只保留了一些比较重要的数据。 先看这里的第一行,这个就是请求行,别小看这一行代码哦,它里面包含了三个重要的信息,分别是请求方法、请求路径以及协议版本。请求方法常见的有两种,一个是 get 方法,另一个是 post 方法。 像糯米这里的就是 get 方法,它表示的就是我想拿到一些数据,比如你想看一个网页,搜索一个关键词,浏览器就是用 get 方法去索取数据的, get 方法的参数是直接挂在 url 后面的,就像这里的 w d 等于 python, 这也是我们上节课学习的内容。 那么 pos 的 方法呢?表示的是我想要提交点东西,就好比你要登录一个网页,需要输入账户密码,或者你要写一篇小作文发表自己的感想,这些私密或者大批量的数据就适合用 pos 的 请求。这些数据呢,会放在请求体内,而不是直接拼接到 u l 后面, 这样做 url 过于永长不说,还容易导致数据泄露。接下来 get 方法后面呢,是一个斜杠 s 加相关参数,这就是请求路径,表示的是你要访问的资源所在服务器上具体的位置。这里就说明百度的搜索路径是斜杠 s。 最后是一个 http, 加上斜杠一点一,这些代表的是 http 协议的版本, 目前大多是网站用的都是一点一版本,少部分已经用到了二或者三版本,我们写爬虫时候通常用一点一就足够了。我们再看请求头部分,它里面都是由很多建制队组成的,是用来告诉服务器更多的细节信息。 我们主要看以下关键的部分,这里的 host 表示的就是我们访问的域名,在这里也就是百度的域名。宝宝们注意了,域名和 ip 地址是不一样的东西, ip 地址通常是数字,域名则是 ip 地址的标签。上节课我们也详细讲解过,这里就不再赘述了。 再看这里的 user agent, 这是十分重要的数据,如果没有这个标识,网站服务器是不会给到正确的网页数据的。 因此爬虫在访问服务器时候,我们需要传入这个标识,让爬虫伪装成一个真正的用户去进行操作。 accept 后面接着的代码就是告诉服务器我们能接受哪些格式的数据,比如常见的 j、 s、 n、 html, 视频、图片等。 最后是同样重要的 cookie, 它携带了一些登录凭证或者一些绘画信息,能够让服务器知道你是谁。 cookie 也是一个十分重要的内容,后续糯米会专门出一期视频讲解里面的知识点,现在我们只要知道它十分重要即可。 请求头后面跟着的是请求体,但是 get 方法一般没有请求体,因为它主要是去拿东西。而 post 的 请求则会把用户提交的一些信息放在请求体内。 讲解完了,请求头,也就是 response headers, 服务器在接收到浏览器发出的请求后,会返回一个响应,这个响应也分为三个部分,分别是响应行、响应头以及响应体。这里糯米也把服务器的响应原始数据粘贴过来了。宝宝们看第一行就是响应行, 前面的 http 斜杠一点一就是我们的 http 协议版本。接着是一个状态码,这里两百表示的是你的访问正常,数据也能正常获取。相信宝宝们也接触过这些状态码,就比如你收藏的网址突然有一天无法访问了,那么你看到的就是四零四状态码。 其他的还有一些状态码,像这里的三零幺表示的是网站永久重定向,这个网站搬家了,换了一个新地址。 五百表示的是服务器内部出错了,这个就不是我们浏览器或者用户的问题了。最后这里的 ok 表示的是状态码的文字描述,常见的还有四零四 not found。 再看这里的响应头,里面的数据同样是用键值对存储,这里的 content tab 就是 告诉我们服务器返回的数据内容的类型。像糯米这里得到的就是一个 html 文本类型,它的编码格式是 utf 八类型。 下面的 content length 代表的是返回的数据大小,这里的 set cookie 表示的是服务器要用户保存的 cookie 数据,也就是一些缓存数据。 最后就是响应体了,这里面就是我们真正想要的内容了,如果你请求的是一个网页,那么这个响应体就是一个 html 代码。 如果请求的是图片,那么得到的就是二、静止数据。如果是 api 接口,那么响应的可能是一个 jason 封装的字符串。我们说的爬虫获取数据,就是从响应体内提取我们需要的数据。 好了,以上就是本节课的主要内容了,我们已经充分了解了爬虫的工作机制,掌握了它的原理。那么在 python 中,我们如何让自己的爬虫发送一个 h t t p 请求呢? python 中的 request 库就能轻松做到这点,这也是下节课的重点, 宝宝们准备好亲自动手编辑一个爬虫程序了吗?关注糯米,持续带你掌握 python!

前面我们都是用 get 请求去拿 excel 源代码,这节课我们来看 post 的 请求,它是往服务器提交数据,然后服务器再返回结果来打开第四关。这是一个翻译网站,我们打开网络面板,如果这里有请求设置,可以点这个按钮清空, 我们在这里输入 cat, 就 可以拿到翻译结果。当然并不是真的翻译了,这只是模拟翻译,用来练习 post 请求的。翻译的过程中,页面发了一个请求,这是它请求的 url, 请求方式是 post, 其他先不用看。我们点到载荷,这里有一个表达数据, k w 等于 cat, 也可以看它原本的格式,这个 cat 就是我们输入的需要翻译的内容。注意,这里和 get 请求不同,参数并没有直接放到幺二 l 里。回想一下之前翻译的例子,参数是用问号拼到了幺二 l 后面,比如配置等于一,而 post 请求参数一般都在载荷里。在登录场景下,如果参数放到幺二 l 里,账号和密码就会直接暴露到屏幕上, 容易被别人看到,放到这里普通用户一般不会注意到,更安全。然后我们点开响应,格式化一下,就可以看到翻译结果。接下来我们就亲手发一个 post 请求,把 url 拿过来,新建一个六五零四, 导入 request, url 准备好,然后就可以用 request 发 post 请求了。注意, post 请求是有载荷信息的,这里是表达数据。以后我们还会看到其他类型的数据, 它的格式是 kw, 等于翻译的内容,这里我们就用字典的格式来书写, kw 等于 cat。 再给 post 传一个 data 参数等于这个 data 字典一定要注意,只有载客信息是这种表达数据,这个参数才叫 data, 其他类型的数据 参数就不是对它了,到时候我会重点强调。至于这个变量名,你可以随便起,一般我们还是习惯叫对它。当然还有一个 u a 伪装,别忘了这是最基本的反爬手段,大部分网站都会有,所以不管它有没有 u a 胶原,我们都给它加上请求。发出去之后,服务器会返回一个 response 来打印一下响应结果, 翻译结果就拿到了。有没有发现这个格式很像我们的字典?这个叫接生格式,可以来看一下响应头, ctrl type application 表示服务器返回的是接收数据,如果你不清楚什么是接收的话,可以回看接收基础片。 接收本质就是一个逗号串,逗号串本身操作起来并不方便,如果能把它转成发送里的字典就完美了。当然你可以用接收模块来进行反训练化。带 request 提供了更便捷的方法,直接用 response 点一个接收,这样它就变成了一个接收字典。可以按住 command 点进来看一下它的源码, 它其实也是把响应的文本数据用的接闪,反虚拟化的,不信我们搜一下。它是把接闪重命名了,再点进来看,这里看到了吗?也是导的接闪,只不过它做了很多兼容性处理, ok, 把它保存到变量里吧。然后来看它的类型, 就已经是字典了。字典的好处是可以很方便的读取里面的数据,比如我要读这个 data, 直接读就行了, 再读取它里面的内容就很方便。当然这里的翻译内容我们也可以用 input 来输入,更灵活。 ok, 最后我们再来用 post 请求,简单上传一个文件,它这里有一个文档翻译上传,那我就选择一个文件, 然后上传,这里就又发了一个 post 请求,这是请求的 url。 再来看载客,同样是表达数据,字段名是 file, 只是二进字数据,我们来用代码试试看,就基于它来改吧。把 url 换了, k w 换成 file, 它的值。要是一个二进字文件数据,那我们在这里新建一个 test 点, txt 内容随便写。这里就用 open 函数以 r b 模式打开这个文件,对文件操作不熟悉的同学可以回看拍摄基础片。注意了,文件上传这个字典就不是传给 it 了,而要传给 fars。 为什么是复数呢?因为它支持一次上传多个文件。先来跑一下吧, 成功了对吧?当然这个翻译结果也是模拟的,如果要上传多个文件,这里就放字段名和打开的文件,这样就可以一次上传多个文件。 不过文件上传在爬虫里并不常见,了解一下就行了。最后来看一下关卡要求,他说密码在返回的结果里就是这个 ansel 的 字,来提交一下。

仅仅三步,数据就能从服务器飞跃到你手机,想知道中间发生了什么吗?我们日常刷 app 是 下滑、刷新、点击、加载的,操作就是整个数据传输链路的起点。手机会先把你的操作需求整理成标准化的请求包, 里面包含要访问的服务地址、用户身份凭证、具体请求内容的参数。就像寄快递前先填好收件人、寄件人包裹内容的面单。不少朋友可能以为操作后会直接连接服务器, 实际上这一步还停留在本地处理阶段。如果你的账号还没登录,请求包根本不会生成,系统会直接弹出登录提示,不会额外浪费网络资源。 请求包生成完成后,首先要解决的就是询址问题。 app 预设的服务器地址通常是域名,比如各大短视频平台的 api 接口域名,这就像你只知道对方公司的名字,不知道具体办公地址,没法直接寄快递。 这时候,手机会先向运营商提供的 dns 服务器发送查询请求,拿到域名对应的公网 ip 地址。 如果之前查询过这个域名,且缓存还没过期,就直接调用本地存储的 ipi, 不 用再走完整的查询流程。不少人以为同一个域名对应的 ip 是 固定的,实际上不同地区查询会返回就近的节点 ip, 目的就是为了提升访问速度。 拿到目标服务器的 ip 地址后,请求包就正式开始了长途传输。请求包会从你当前连接的 wifi 路由器或者手机基站出发,沿着运营商的骨干网络一步步往服务器方向传输。 每到一个中转节点,节点设备都会读取目标 ip 地址的归属地,选择最近的路径继续转发。就像快递经过网点、中转场、配送站层层传递,很多人以为请求是走直连线路直达服务器,实际上中间通常要经过十到二十个中转节点, 某个节点拥堵时还会自动切换传输路径,这就是有时候重启路由器就能恢复网络的核心原因。经过层层转发的请求包,到达目标服务器后, 并不会直接返回你要的内容。服务器首先会做安全叫验,比如验证你的用户身份是否有效,有没有权限访问请求的内容。恶意爬虫或者未登录的无效请求会被直接拦截,返回对应的错误码 叫验。通过后,服务器才会从数据库或者缓存里调取你要的内容,打包成响应包,把你的手机 ip 设为收件地址发回。不少人以为服务器收到请求就一定会返回数据,实际上超过百分之六十的无效请求都会被直接过滤,根本不会进入后续的业务处理环节。 如果要传输的是几百亩的视频这类大内容,整个响应包不可能一次性完成传输。服务器会把响应数据拆成多个最大一千五百字节左右的小分片,每个分片都标好序号和总分片数。就像大家聚会拆成多个小包裹分别邮寄,每个包裹上标清楚是第几件。 很多人以为大文件是一整块传输的,实际上拆成小分片后,就算其中某一个分片丢了,只需要重传这一个分片就行,不用整个文件重新发送,能大幅提升传输效率。网络传输过程中难免出现分片丢失的情况,就像快递运输路上可能出现丢件, 大部分场景下,我们会采用 tcp 协议做传输保障。手机每收到一个分片,都会给服务器发一个签收确认,服务器如果一段时间没收到某个分片的确认回值,就会自动重传这个分片,直到确认你收到为止。 如果是视频、通话、直播这类对延迟要求极高的场景,就会切换为 udp 协议,就算出现丢包也不会重传,避免卡顿影响时效性。很多人以为所有传输都是可靠的,可能性会主动给延迟让路。 所有分片都收齐后,手机并不会直接把数据交给对应的 app 处理,首先会按序号把分片拼接成完整的数据包,然后比对数据包附带的校验码,就像你收快递时拆箱检查物品有没有损坏,是不是你下单的商品, 如果校验码不匹配,说明数据在传输过程中被篡改或者损坏,就会要求服务器重新传输。很多人以为收到的数据就一定是正确的,实际上,网络传输过程中可能出现信号干扰导致的比特错误,校验是必不可少的环节,不然就会出现图片花屏、视频解码失败的问题。 如果这次请求的是头像、静态图片这类短时间不会变动的内容,服务器返回数据时会带上缓存有效期,比如标注七天内不用更新,手机就会把这份数据存在本地存储空间里。下次再请求同样的内容时,直接调用本地的缓存就行,不用再走完整的传输流程,既节省流量又能提升加载速度。 很多人以为每次刷 app 的 所有内容都是从服务器实时获取的,实际上超过百分之七十的静态内容用的都是本地缓存,这也是 app 用久了占用存储空间越来越大的主要原因之一。抱怨通过的完整数据交给对应的 app 后, 整个流程还没走完。 app 会按照提前约定的格式解析数据,比如文字内容用 jsn 格式解析,视频内容用 mp 四格式解码,再调用手机的 cpu、 gpu 把内容渲染到屏幕上,直到加载提示消失,你就能看到刚刚请求的内容了。 很多人以为数据传到手机就代表加载完成,实际上 app 的 解析渲染环节也会占用不少时间。这就是为什么有时候手机信号满格,刷 app 还是会卡,大概率是手机性能不足导致的,和网络本身没有关系。以上就是今天关于数据是怎么从服务器传到你手机的的全部内容。

魏老师,这个 modbus tcp 指令我看不懂,你给我讲讲呗。 modbus tcp 通讯,新手只要学会这两个指令就够用了,一个是客户端指令,一个是服务器指令,如果 p r c 做客户端就调用这个指令。 mb clint, 这个指令就在通讯下面的 modbus tcp 文件夹里面找到这个 mb clint 播放过来。 这个 iq 就是 发送通讯请求,这里每接通一次就会发送一个通讯请求。这个 disconnect 就是 断开连接的意思,一般我们都设置为零,就是建立通讯连接,那设置为一就是断开连接,就不能和其他设备进行通讯了。 这个 mod 一 就是读写模式,零就是读,一,就是写这个四万零一,就是要读写的寄存器的地址,可以是三万零一,也可以是一万零一,也可以是零零零一。 这个地址具体是多少,你要查看你要访问那个设备的通讯手册,这个八是你要访问多少个数据, 这是八个,也就是从四万零一开始的连续的八个。下面这是一个地址指针,它是一个数据缓存区,也就是你要读写的数据放到哪里。 这个指征指向的是 mw 一 百开始的连续的八个字。结合前面这几个引脚,这个指令的含义就是读取从四万零一开始的连续的八个,把读到的数据放到 mw 一 百开始的八个字当中, 如果这里不是读,是写入,那这个指令是什么含义呢?他的意思是把提前准备好的从 mw 一 百开始的八个字,把这个数据呢写入到从四万零一开始的八个数据当中。 下面这个 connect 指向的是你要访问哪个服务器,这个参数里面就包含了服务器的 ip 地址和端口号。打开这个 db 块看看, 这里有一个 connect, 它的数据类型是 t c o n 杠、 ip 杠 v 四。这个数据类型啊,要手动输入啊, 这个是硬件标志符,一般默认的都是六十四啊,那硬件标志符在哪看呢?就在这个网口的属性里面有个系统常数,那这个 private 的 接口一标志符就是六十四。 不要看这个带端口的哈。这个 id 就是 一个连接编号,也就是你要连接哪一个服务器的 id, 服务器那边也有一个 id 编号,如果那边是一这边你就填一。这个参数是连接类型,一般默认就是十六禁止的零 b, 他 指的就是 t、 c p 协议,不用修改啊。 这个参数是是否主动建立连接,如果是客户端就填一,就是主动建立连接。如果是服务器呢,就填零,就是被动接受连接。下面这个参数指向的是一个 ip 地址, 客户端要连接服务器的话,那你服务器的 ip 地址是多少?你要填在这里。这个五零二是端口号,指的是服务器的端口号, 这是服务器这边的连接参数,因为他的本地端口号是五零二,所以你这里就要填五零二。如果这边是一百,那你这里也要填一百,这个是本地端口号,一般客户端这边填不填影响不大。再看这几个输出参数, d、 o、 n、 e 是 完成信号, a、 z 是 忙碌信号,这个是错误位, 这是运行状态,如果发生异常,这里会显示错误代码。如果 p r c 做服务器,就调用这个指令, mb server 这个服务器指令,在通讯选项卡下边有一个 mb server 播放过来。 这个 disconnect 是 断开连接的意思,一般默认都是零啊,如果这个值为一,那客户端就连接不到它了。 这里是一个数据缓存区,也就是开放一段数据区域,给到客户端来访问。 这是一个地址,指真,他指向的是从 mw 一 百开始的,连续的一百个字,这个数据缓存区也可以使用。 db 块里面的数据,前面我们已经讲过了啊, 下面这个 connect 指的是连接参数,打开这个连接参数,我们看看这个连接参数和刚才客户端里面讲的是一样的, 不同的是这里是被动建立连接,所以这里要设为假服务器。这边的 ip 地址可以不填,但是本地端口号一定要填上去, 因为客户端连接的时候要用到这里的 ip 地址,如果你填了,也就是指定只有这个 ip 地址才能进行连接,其他的客户端都不能连接,所以设为零呢,就是其他客户端也可以过来连。 n d r 是 客户端写数据的状态,如果正在写数据,它会为一。 d r 是 客户端的读状态,如果正在读数据,它会为一。 l 是 错误标志位,下面这个是状态字,如果通讯异常,这里会有错误代码,怎么读取这个错误代码呢?当这个错误标志位接通的时候,把错误代码传出来。

哈喽,大家好,我是龙仔。呃,今天来给大家分享的是就是 r t s 中如何来使用网络请求获取数据,然后在就是我们的这个应用中进行一个展示, 下面就是看一个案例,这个案例呢是从我起的一个服务里边,这是一个服务器写的一个永东的 gs 写的一个服务器,然后从它里面嗯,调用接口获取到我们这个新闻的一个类型, 然后这样展示了一个这种 type 栏。下面的话我们主要来看一下这个案例,嗯,是怎么来实现的,我们来看一下这个我写的这个笔记啊。首先我们呃使用使用这个 r t s 中的一个 http 模块,可以封装一个这种请求函数,嗯,在这里可以看到啊,我封装了一个 request get 这样的一个函数,相当于我们可以请求封装了一个发送 get 请求的 一个函数,然后用来就是请求我们的数据,像我们在前端中用到的一个 xs, 然后对 xs 进行的一个二次封装这样的一个概念。 首先我们来看一下它的用法,然后 http creat https, 然后返回一个 http request 这样一个对象,这个对象呢它有一个 request 函数,然后可以用来发送网络请求,然后第一个参数就是我们要请求的这个 url, 后面的话有我们的请求方法, get get get 请求,然后呃就是超时时间,还有这个 header 我们的头部,然后要自己要携带的哪些信息,这是一个 connect to melt, 就是连接超时的一个时间。 呃,另外的话还有一个 extra date, 它这个它这个参数其实就是我们在呃就是钱当中写的一个 date 这样的一个参数,就是我们的请求题, 呃,然后我们可以看到它这里通过 http request 第二 request 这个函数返回的,它其实是一个 promise 对象呢,嗯,然后通过这个 promise 对象,然后 点赞,我们可以取到就是这个网络请求返回一个数据的这个对象,这个数据对象中他包含了哪些?就是字段呢?我们可以看一下他这个官网啊, 它这个 api 中 require http response, 它有一个 result response code, 还有 header, 然后 cookies 这几个,主要我们用到的就是这个 response code, 还有这个 result response code 呢,就是我们的,嗯,他这里写到了回调函数执行成功时,此字段若执行失败,错误码将会从 s clue every 的返回,错误码如下,两百就是二零二,还有三百这样的一个错误码,我们可以通过这个错误码来判断 我们的请求是呃正常啊,就是异常还是呃正常的这样的一个东西。这里我们我通过了 restore code, 然后是否等于 http code, 呃,这样呢?这是一个 cost, 一个媒体的常量啊, 那我们来通过这里来看吧。然后这个 cost, 这 cost 是什么呢?它其实是定义了一个这种类,在常亮这个这个里边,这个文件里边定义一个这个常亮这种常亮的一个对象, 这个对象中包含了 h t p 扣的两百这样的一个长量,如果等于两百的话,说明我们的请求是成功的,然后我们又可以呃取到它这个 result 就 是我们的,就是呃响应体,然后我们他从服务器获取到的一个数据,然后对他进行一个解析,然后 jason pass, 然后解析出来, 把它解析成了一个对象,然后这个对象中呢?他这个对象我,我可以看给先给大家看一下这个 喊就是这个请求啊,他请求是返回这样的一个数据的,他有一个 d 扣的一个 date, 一个 msg 这样的一个对象的一个结构, 我们这里就是通过这个 result result, jason 就是我们这个请求题,就是这个响应题啊,就是这样的一个结构,然后通过通过这个 server dat, 我们将这个强硬体里面的内容都复制给这个 server dat, 然后最后我们将这个 server dat 相当于返回出去了,就是将我们的这个返回的数据,然后就是通过这个 return 给它 return 出去, 我们可以知道了解 promised 它这个字, return 出去它其实还是返回一个 promised, promised 会包含呃包,就是又对这个 server data 进行一个一层包裹,然后还是当我们调用这个, 我们可以看到它这里返回一个,我们调用这个函数的时候,它其实最后也是返回一个,也是一个返回一个 promise, 这个 promise 呢? 我们可以在这里用到。呃,我们可以看到啊,这里 content view model, 然后这里相当于是我们真正的呃请求的业务数据。那刚才那个呢?就是我们请求的一个 就是封装的一个函,就是封装的一个请求函数吧,相当于我们 xs 中对,就是一个二二二次封装。在这里呢,我们获取这个新闻的一个类型,然后请求了这个, 他这里是用了一个 new ref, 呃, new promise 就是创建了一个 promise, 然后 这些个地址,然后调用这个 request get 方法,这是我们刚才封装的那个函数,我们可以看到这是我们刚才封装的这个 get 函数,然后通过调用它传入幺 l, 然后 并且它最后是返回一个 promise, 调完这个以后它是返回一个 promise, 我们可以调用它的增函数,增函数呢?这个 result, 这个 result, 它这个结果就是我们这里啊,这里这样的一个结果, result 我们有,这里提前定义了它的一个类型 response result 这样的一个类型, responsible result 是在下面这里我们定一个类,然后就是 因为它这个 r p t s 是基于一,就是 r p t, 而 r p t s 啊,是基于我们的 t s 来进行一个就是实现的,所以说呢,呃,它都需要每一个数据,我们都需要一个类型, 所以说他这个返回的这个数据结果呢?他是一个这种类型的,所以说我们要对他进行一个提前的一个类型的声明,像这个他有 code 呀, message 啊,然后 data, 他这个每个数据自带这个属性,都是对应的一个什么类型的这样的一个值。然后最后我们 就是创建了一个这这样的 classley, 然后我们就是创通过这个 classley 声明实力的时候,他其实就可以返回一个对象吗?那个对象就可以作为一个这种一个对象类型,然后复制给我们的, 复制给我们的这个 response 定义它这个就是啊这个 result result 定义它这个数据的一个类型这样的一种情况,然后我们也是 可以判断这个 result 中它有一个 cod 的,如果是 success 的话,我们可以看到它这里是返回一个 success, 如果是返回就是 success 的情况,是 这个单词的情况,我们就 resolve 这个 results, your data 相当于我们把这个就是最后的这个数据,我们这个数据列表,这个 list, 这个 data this 是一个数组,我们把这个数组给它 resolve 出去, 有动物出去以后,嗯,我们可以看到我们在实际的页面中,在这个 home deer ets 这个页面中,我们使用到了刚才那个请求的那个数据, 我们可以看到在这个页面中 about to appear, 就是当我们页面将 下载的时候,我们去请求了这个 get new type 这个函数,其实我们去获取数据了,我们来获取数据, 当我们获取到数据以后,啊,这里啊当我们获取到数据以后,它其实也反馈是一个 promise, promise, 然后我们取到了这个数组, 我们知道这个数组他是这样的一个类型,我们这里也定义了一个这种 tap 的一个类型,他这个 tap 每一个就是他都每个对象里面都是有一个 id, 有一个内幕,所以说我们这里定义了一这样的一个 class, 然后并且在这里对他进行了一个类型的声明,他这样就不会报错了。并且在我们定义这个初始化这个页面中,这个 set 这个变量的时候, 我这个 r e s 也是这样的一个呃数,呃数组类型的,这样他每个数组中的每一个这种值都是这样的一个类型来进行一个类型的定义。最后我们将这个 dat 复制给了这个 r this r e s 并且然后最后实现 在我们的这个页面中进行一个展示,通过一个 types types, 然后使用 foreign 来对它进行一个循环,然后循环呢? 循环以后他这个 tip table table content 相当于我们的这个切换栏,他每一个切换栏中展示的内容,然后我们展示了一个 text, 展示了他这个内幕,就是我们他这个每一个对象里边都有一个内幕,我们展示了他这个内幕,然后他这个 type 栏 他我们切换的那个按钮,他也是我们使用了他这个内幕这个值,就这样最后我们就实现了这样的一个效果,这样一个 type 切换 需要注意的是就是在 r t s 中我们发送网络请求, 我们要注意他这个每一个返回的这个结果,他都是需要一个类型声明的, 就是我们需要给他复制一个类型定义,他不像我们写 g s 一样就是很随性的,但是写 r t s 的话,他就对于这个类型要求就是非常严格的 类型,通过他是会各种爆错,导致我们的开花就无法进行下去,所以说,呃,这里麻烦的话就是主要是就是规定我们的这 个类型这样的一个问题。呃,好,那今天的分享就到这里,呃,如果大家感觉呃对于自己有帮助的话,呃,希望大家能给一个支持,感谢大家的关注。

好,来看这一道笔试题,选择题的第二题, http 协议当中,请求永久重定项和服务器错误的状态码分别是多少?那么大家呢,可以先暂停视频自己思考一下。 那么这个 http 状态码呢?嗯,它主要被分为五类啊,第一个呢,就是一开头的,哎,一开头的还有二开头的以及三开头的,四开头的还有五开头的。那么一开头的是什么呢?就是请求已经接收,需要继续处理。请求 请求接收,哎,需要继续处理,那这个二开头的呢,表示请求已经成功处理啊,请求成功处理,那么三开头的呢,就是需要进一步操作完成请求。需要 请求四开头的呢,就是请求包含,哎,语法错误。 那五开头的呢,就是服务器在处理请求的时候发生了错误,呃,服务器在 处理请求时,请求时发生错误。 ok, 那这是这五个类型他们分别代表的意思。咱们回到题目当中,请求永久重定项,那么这里面其中第三项啊,第三类,它这里面有三零一,还有三零二,哎, 还有像三零四,咱们来说一下,三零一,它代表的就是永久重定项,永久重定项 表示你请求的资源已经被永久转移到了新的位置,好吧,你客户端应该使用新的 url 来访问资源,并且可以缓存这个充电线。那三零二呢?它表示的是临时充电线啊,临时。 那么三零四呢?他表示未修改,也就是没有修改, ok, 那 这个是重内项。那什么是服务器错误呢?代表的是这个五百这个地方,比如说他有五百,五零幺,哎,五零二等等。首先呢, 五百是内部,就是服务器内部出错啊,服务器内部出错好,那么五零幺呢?它表示服务器不支持请求的方法或者功能,哎,服务器不支持请 求的方法,那么五零二呢,就是你服务器作为网关或者代理的时候,从上游服务器收到了无效的响应,无效响应, 那么回到咱们这个题目当中,是不是就是三零幺和五百啊?对吧?所以说它答案呢就是 a, 那 么你做对了吗?

你从大洋彼岸下载了一个视频,它是如何传输到你的手机的呢?首先,如视频这样的数据存储在数据中心的服务器中,所有的数据都是由零和一构成。我们都知道设备都有 ip 地址, 它用于唯一标识连接到互联网的每个设备,而服务器也有一个 ip 地址。但是为了既互联网,使用域名,也就是网址来对应 ip 地址, 域名转换为相应的 ip 地址是由 dns 提供的,它就类似一个巨大的电话簿,当你输入一个域名时,浏览器向 dns 服务器发送请求,获取相应的 ip 地址,然后浏览器将请求转发到数据中心,具体来说是转发给相应的服务器。 数据以数字格式通过光纤传输,他有时必须通过数千里,而且还要经过复杂的地区,如山居或海底。整个互联网的骨干是由这些光纤组成, 他们把数据从数据中心传输到你附近的路由器,路由器将光信号转换为电信号,再通过网线将电信号传输到你的笔记本电脑。如果你通过移动数据连接互联网, 信号将被发送到一个移动基站,然后以电磁波的形式到达你的手机。网络技术原理,一看就懂,一上手就废!这本由清华大学出版出品的网络工程师实习教程,赶紧去拍它!它包含华为华三 思科全品牌实战知识,由浅入深,从基础入门操作到交换机配置、路由器调试、广域网搭建,每一步都讲解透彻。结尾用企业真实综合项目,整合知识点,助力零基础新手快速上手。先带你安装各类模拟器,依照华为、华三、 思科的顺序分布教学,每一步都搭配实景图式,跟着操作就能熟练掌握。以交换机 v l n m 配置为例,每个章节都附上三大厂商的完整配置指令,还汇总了不同品牌命令对照清单,每句指令都标注中文示意,学习起来轻松易懂,完全不用担心学不会。本书附赠五小时配套实操视频, 跟着视频逐步练习即可。目前正值优惠活动,即便当做常备工具书留存也十分划算。想要从零开始学习网络技术的朋友,左下角直接入手一本!