辽宁网站设计,公司网站建设方案拓扑图,网站建设综合实训心得体会,如何注册域名免费047_http模块_获取请求行和请求头 hello#xff0c;大家好#xff0c;那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法#xff0c;我在这个文档当中都已经记录好了#xff0c;方便大家后续做一个快速的查阅。
… 047_http模块_获取请求行和请求头 hello大家好那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法我在这个文档当中都已经记录好了方便大家后续做一个快速的查阅。
首先咱们先说一下就是为什么咱要去获取请求报文当中的内容比方说这个是咱的服务这个是浏览器它他可以把请求发送过来那发送过来之后咱为啥要去对这个报文内容做一个提取呢原因很简单就是为了能够给他返回正确的一个响应结果。 我给大家举个例子比如说强哥开了一个餐厅开了一个饭馆然后客户可以来我这就餐然后要想给客户给他返回他想要的这个菜或者说是饭我就必须得到他的诉求不能说他跟我说给我来个来碗面是吧我给他来个蛋炒饭
他说给我来一个鸡蛋灌饼我来给他来一个手抓饼这样一来的话就不合适了是吧咱这个饭馆也就开不下去了所以说要想给这个客户返回他想要的这个东西就必须得到他的诉求。
对于咱这个 http 服务来说也是如此你要想给他返回他想要的结果就必须得从报文当中能够提取到相关的这个数据才可以。
好了那么下边的话在代码层面给大家演示一下相关的一些使用和操作么首先咱们先建一个文件来一个03这是提取 http 的报文。
这写个03然后把 01 里边内容咱直接复制一份儿拿过来粘到这一块儿把一些不必要东西咱们全给它卡掉。 OK cut 掉以后咱们接下来的话给它启动一下子这里来一个 NODE 03 table 全会吃好大家可以看一下报错了报错了这个问题该怎么解决呢当时咱们说过首先咱们先找到之前监听 9, 000 那个服务找到之后先给它停了停了以后咱们再过来去运行新的这个脚本启动完之后咱们可以打开浏览器去访问一下 9, 000 这个端口敲回车你可以看一下乱码了是吧乱码没事我这里先不使用中文我先写一个 HTTP 的一个英文。 要想看结果我们必须得重启把这个 color 重新启动切过来再重新访问一下子。
OK没有问题。好 下边的话我们就开始去看一看报文内容应该如何去提取。首先咱们先看看控制台打开标头然后打开请求标头然后打开这个源代码我们知道这一片内容是什么呢是这个原始的请求报文当我们敲下回车之后他就会把这一篇内容发送给咱这个酒店端口。 好那么下边的话咱们也看来更加清楚一些强哥这样来给大家演示一下子打开这个 processon 的画图工具。
就是当我们刚才在敲下回车之后然后这个请求报文就从浏览器端发送到了 9, 000 端口发送到 9, 000 端口之后谁来去处理这个报文呢 其实就是咱这个回调函数哪个就这个就这个儿只要你把请求发过来咱这个回调函数它就执行诶并且还给你返回响应报文。所以就是你要是想获取请求报文里边内容咱必须得把代码放在这个回调函数里边才可以。
好那么接下来咱们一个一个的来获取。
首先咱们先看一看这个请求报文当中的请求方法该怎么获取切过来给大家演示一下子哎写上注释是获取请求的方法我们来看一下这里用的是 request.method method单词的本意就是方法的意思它可以获取请求报文当中的这个请求方法。
好那么接下来咱们重新启动一下子nodejs服务摁上敲回车然后切过来浏览器打开这个标签页咱们再来重新访问一下子敲回车好又把报文发了一次
发过来之后咱们这个回调函数执行然后输出你可以看一下这里有两个get。为什么会有两个gas 原因很简单是因为浏览器在我们敲下回车之后他发了两次请求一个是这个 search 这个 keyword 这个请求另外一个是那个 favicon 的图标请求 这两个请求都发送了过来所以说这里有两次输出。
好这是第一个内容的获取请求方法下面的话咱们再来说一下第二个内容的获取day就是关于这个 URL 部分的内容提取那这个内容咱们该怎么获取呢
也很简单获取请求的URL用 request.url 就可以获取。 好那还是一样咱们重新启动一下子按上回车打开浏览器重新去发请求敲回车。
好我们打开控制台去看看输出结果你会发现它这个输出结果有两个这个结果可能有点出乎你的意料为什么呢因为这个 request.url 它只包含注意只包含 URL 中的路径与查询字符串也就是说它是不包含 URL 当中的协议域名和端口的它只包含路径和查询字符串。 大家同学说我就想获取一下协议和 IP 和端口怎么办呢
你别急是吧待会的话咱们有别的办法来去获取。
好这是第二个内容的获取 下边的话咱们来看看第三个内容的获取谁呢就是关于这个 http 的协议的版本号这个内容咱们也是可以获取的。 好写一下获取 HTTP 协议的版本号这句话咱们可以用这个 request。httpVersion 来获取。、 好我们重新启动一下摁上敲回车然后切过来打开这个页面再重新发一次请求发完之后咱们切过来看看控制台看这儿两个都是一点儿一的版本这个是可以获取的。 不过和大家说一下这个其实咱们用的非常非常少几乎是用不到的。
好那么下面的话咱们再接着往下看还有谁还有就是一个请求头哎请求头这一片内容这个也是可以获取的。
怎么获取
切过来获取 HTTP 的请求头我们借助于 request.headers 就可以获取重新启动摁上敲回车。
咱们再发一个请求过来打开它浏览器敲回车然后再切回来你可以看一下这个结果就出来了这个结果也就是这个 request headers 它的结果值它是一个对象。可以看一下对象里边就包含了请求头的所有内容对照来看一下兄弟们点击它我把请求头这一块再给它贴个图咱看得清楚一点。 好拿过来看一下这个是请求的报文过来之后 headers 里边保存是一个对象名字是对应的你看这有host是吧这有host这有connection这有connection这有 catch control这也有 catch control都是对应的。
而且还有一个细节需要大家注意一下子就是这个对应里边每一个属性的名字它都变成了小写你看最原始这个请求头里边是吧它的名字它还是用这种大写字母但是到了对象里边就全都变成了小写它内部做了一个这样的转换。
当然还有另外一个细节同学说你看有的有引号有的咋没有引号这是咋回事呢这个其实比较简单主要是因为像这个 cache control是吧 user agenda 它们是一个双拼词中间有一个横线这个横线它不是一个标准的标识符所以说它不能去省略这个引号。
一旦你省略他这哥们横岗成减号了解析通不过了。所以说他如果想作为一个建议名就必须得用引号把它包起来。
好了这是关于请求头的一个获取那将来如果说你只想获取其中某一个请求头怎么办呢你就可以这么去做比方说我想获取这个host哎就包含这个 IP 和端口的就可以这么去做点儿来一个 host 保存好接下来我们重新启动一下子看看效果怎么样。
切过来浏览器然后重新发请求地址栏敲回车再打开它瞅一眼你看都可以获得单独的那个请求头的信息值。好了这是我们给大家介绍一下这几个属性获取了一下
请求的方法、
URL、
http 的版本号
以及请求头
当然请求体咱们还没说别着急咱们下个小节把请求体内容的获取给大家介绍一下子。 048_http模块_获取请求体
hello大家好那这条题的话我们书接上文来介绍一下如何去提取请求体当中的内容。 首先的话我们先新建一个脚本文件来个04然后提取 http 报文的请求体。好那还是一样为了方便我们把代码直接 copy 一份拿过来放到这然后把这个咱们全卡掉然后把服务跑起来。 首先咱们先把这个 03 那个先停了来一个NODE然后 04 table 交回车打开浏览器先访问一下子看看好使不好使好没有问题啊。然后当然这一块我们目前你这个 URL 路径你写什么都对这个结果没有任何的影响。 比如说我这写一个斜杠a是吧来一个斜杠b你写什么它都没有变化。
有的人可能会说那强哥这不对劲你看我们平时访问某些网站的时候这路径不一样就是 URL 路径不一样这个返回的结果它是不一样的。为什么咱们这一块它都是结果都一样的
哼这主要是因为咱们并没有去做一些额外的功能的实现所以说它的结果是一样的。就说你这个请求只要过来之后就执行这个回调函数。这个回调函数一执行就给我们返回这个响应结果所以说的话它是它这个返回结果是固定的你要想不一样等后边咱们再讲一些内容就可以实现不同的响应结果的返回。
那么下面的话咱们来看看这个请求体它该如何去获取这里的话它需要做三步第一步的话我们要去声明一个变量用这个变量去接收响应起的结果。
我们写一个 body 等于一个空的字符串这是第一步
然后第二步就是绑定事件给这个 request 绑一个 data 事件啊。后边跟一个回调函数这个代码的话大家可能还是有一些印象的之前我们在介绍这个可读流对象的时候说过要想获取这个可读流里边的内容我们就需要绑定这样一个 data 事件然后就可以一点一点的把那数据取出来。那么对于这个 request 对象来说它其实本身就是一个可读流对象我们可以通过这种方式来把请求题里边内容一点一点的取出来。
好那这个就是每次从里边取出来一部分我们可以把这个取出来一部分存到 body 当中像这个样子 body 然后加等于一个chunk。顺便再解释一下 Trink 这里它本身是一个buffer如果他去做一个加法运算内部会自动将这个 buffer 转换成一个字符串那如果说你感觉有点不对劲你可以怎么办呢你可以加一个toString这个也是 OK 的。当然了这里没有必要啊。 这是第二步绑定一个这样的 data 事件
第三步是绑定一个 end 事件来一个request点on来个end这个 end 就是当我们把数据取完之后它所触发的一个事件就是把可读流里边的数据全都读完了就会触发这个 end 事件然后在 end 事件当中我们就可以把这个 body 做一个操作比方说咱们做一个输出来一个body好等到这你先不要着急咱还没有写完咱们还要给这个浏览器做一个响应添加一个响应来一个 response 点儿 end 来一个 hello http。 好了到这儿的话咱们代码儿就已经是写完了写完之后的话咱们把这个重新启动一下子。好启动完之后接下来我们打开浏览器注意这里有一个细节看它我现在如果直接发请求发送过来之后回调函数执行回到函数执行你发现这一块它是空的啊。 为什么是空的呢当时咱们说过你地址栏里边你直接敲回车它所发送的这个请求是一个 get 请求而 get 请求它的请求体一般都是空的所以说在控制台里边输出结果它也是空的要想在这里看到结果咱们得怎么办呢咱必须得发送一个请求体不为空的请求那怎么办呢简单我们可以点开这个form.HTML。
这哥们儿它是一个表单而且 method 的值是一个post所以当这个表单它在提交时它所发出来的请求就是一个 post 请求并且它还会把表单里边的内容放在请求体当中传递给服务器。所以说咱们可以借助于他来给咱这个服务去发请求。
来试一下右键打开这个浏览器。好表单来了我这里写一写比如说 atguigu是吧我就是密码这里我并没有写成password就是想看得更为清楚一些。
下面的话咱们点击提交把这个请求发出去 点击好可以看一下请求发出去了发出去之后到 9000 9000咱们点开控制台看看这个结果你会发现这个请求体内容就输出来了。哎看这是键名这是键值中间是 and 符。 好这咱们给大家演示了一下关于请求体的一个获取的方法。顺便说一下就是这个操作大家了解一下就可以了在后续会介绍新的更为简单的方法来去提取报文的请求体。
049_http模块_获取请求路径与查询字符串 好这可以的话我们来介绍一下如何去提取 HTTP 请求报文当中的路径和查询字符串主要是指的这一块大家可以看一下这是一个请求报文。我们这个小节所要提取的是 URL 当中的路径和查询字符串儿这两块儿部分 那么其实对于这两块儿部分来说还是非常非常重要的我来给大家举个例子比如说就以这个 processon 点儿 com 这个网站来为例。 然后我们点击推荐可以看一下路径它变成了popular 然后我们点击模板它变成了template。 那么服务器端是如何给我们返回不同的结果呢是根据谁来判定返回的结果呢那么其实就是通过这个 URL 的路径来去判定的如果说我们这个请求的 URL 是popular则返回的结果就是推荐的。如果说这个请求的路径是一个template那则会返回模板的这样一个网页内容所以说这个路径是十分关键的。
其次还有一个就是这个查询字符串它也很关键那像咱们平时在百度里边去搜的内容比如说我们搜一个XYZ举个例子那么你会发现在这个 URL 当中有好多参数是吧 那其实最重要的一个参数就是一个 wd 参数 wd 参数对应的就是那个关键字 可以来看一下比方说我这里把它改一下改成一个a、b、c、d、e、f、g。
改完之后我敲回车注意我并没有通过这个 input 框去输入关键字而是直接改的这个 URL 里边的参数敲回车那么你会发现这个请求过去之后服务端所返回的结果就是跟 ABCDEFG 相关的结果。 由此可以看出这个百度服务器它就是根据 wd 这一个参数的内容来返回结果的所以说你可以看到就是关于 URL 里边这个路径和查询字符串它是非常重要的两个内容我们作为一个服务提供者往往会根据这两块内容来返回他想要的结果。
好那么下边的话咱们来看看在代码层面应该如何去提取 URL 当中的路径以及查询字符串。首先的话咱们先复制一下文件把这个名字咱改一改来个05。提取 HTTP 报文中 URL 的路径与查询字符串儿。
好了中间这一块内容我们都不要了 然后简单写一个响应来一个response点end这里我们写一个URL。好然后接下来我把这个启动一下子来一个 NODE 05 table 敲回车。
报错是吧报错原因很简单因为端口被占了好再切回来之前开启了服务的终端停掉再回去摁上敲回车搞定。 接下来的话我们打开浏览器向这个 9, 000 端口去发一个请求这改成个 9000。然后路径咱们加一下比如说这我们加一个search后边的话是一个查询字符串keyword等于一个 H5 。敲回车好请求过去之后返回结果这里响应体为URL由此证明咱这个服务是正常的响应结果也是 OK 的。 那么下边的话我们来看一看在这个回调函数当中应该如何去获取 URL 当中的路径和查询字符串
也就是说像这个样子是吧你把这个请求发送到我这个 NODE 端了也就是服务端了。发送过来之后我怎么样去获得 URL 当中的路径和查询字符串就这么个意思
要想获取咱们需要借助于一个模块。首先我们这样先把这个原先的编号先给它去了。然后咱们变成提取的步骤第一步先导入 URL 模块儿 const URL 等于一个 required URL这个 URL 模块儿也是 nodejs 的内置模块儿专门用来解析URL。
好那么下边的话咱们再接着继续在这里我们来做第二步。解析 request 点URL这个内容咱们可以先看一看就是 request 点 URL 这个属性当中它已经包含了路径和查询字符串了。 然后咱们切过来浏览器再来访问一次敲回车请求过来了再打开控制台可以看一下这个属性里边它包含了路径和查询字符串 你包含归包含但是它用起来不方便是吧比方说我现在就想要路径咋整对吧就想用查询字符串咋整它用起来不方便所以我们可以借助于 URL 这个内置模块来对这个内容做一个处理。
咋处理呢我们这里的话声明一个变量来个 let res 等于 URL 点parse。注意这个 parse 是 URL 这个对象里边的一个方法单词的本意是解析的意思可以用它来去解析这个内容解析完之后咱们可以来看一看 res 解析之后这个结果好再次重启服务再次发请求。 好我们打开这个控制台看一看这有两个上面那个是第一个下面这个的话是那个 FAVICON 那个请求。好看一下解析完之后这是个对象里边包含了一个属性叫 pathname能看到这个 pathname它就是那个路径 所以说路径是谁呢来个 res.pathname咱们可以来看一看这个结果对不对 重新启动一下再把请求发过来之后看看控制台这个结果你可以看一下第一个斜杠search第二个 favicon 没有问题 所以说通过这种方式是可以获得 URL 的路径的。
那路径获取完毕之后如何来获取查询字符串这里的话要稍微的变动一下你看查询字符串这里也有query是吧还有一个search是吧在这个 query 或者在 search 里边有内容但是个内容它依然是一个字符串 那字符串的话用起来就不是很方便比如说我想单独提取 keyword 这一个参数所对应的值你看这个很就用起来不是很方便那怎么办呢
也简单我们可以往这个 pass 的里边再传一个参数大家可以看看这个介绍往下走你看第一个参数是这个 urlString 就要解析的 URL 这个字符串 第二个内容是 parseQueryString 解析查询字符串 if true就是如果你传一个true则 query property 就这个 query 的这个属性 will always be set to an object returned by the querystring modules parse。也就是说如果说你把第二个参数要是设置为 true 的话那么 query 属性将被变成将会设置为一个对象啊。
咱们可以来试一试来传一个true传递完true之后咱们还是去看一看 res 这个结果值
重新启动一下服务切过来浏览器重新发请求。好咱们再切过来看结果你会发现这个 query 属性它就变了。 pathname 没有变注意 pathname 它没有什么没什么变化。你还是跟之前那样子获取。
这个 query 呢变化了它变成了一个对象。有同学说诶我看着有点怪怪的你看前边这里有一个[Object:null prototype]这个啥意思啊我给大家 说一下。
这个只是一个提示它没有什么实质性的一些作用限制类型啊这功能都没有就是个提示提示什么呢提示这个对象它的原型是指向 null 的别的没什么功能 比方说咱们现在想把这 keyword 单独提取出来怎么办呢咱就可以这样去做 let keyword 等于一个res.query.keyword 就可以了咱们来打印一下这keyword。 好那么接下来咱们重新启动服务摁上敲回车然后切过来浏览器请求重新发再回过头来看一眼你看这 H5 就有了。
那下边这个怎么是 undefined原因很简单就是因为第二个请求这个 favicon它的请求里边没有包含 keyword 这个参数是这么一回事。
好了这是咱们说了一下关于如何去提取 URL 当做路径和查询字符串这个内容对于我们来说还是比较重要的一个内容后续我们会通过它去做一些练习和实践。
050_http模块_获取请求路径与查询字符串(新) hello大家好那这个小结的话我们来介绍一下提取 URL 路径和查询字符串的另外一种方式。首先的话我们先打开编辑器然后把这个文件咱复制一份给他来一个06把这个名字咱稍微改一改功能跟 05 那个是一样的都是为了提取路径和查询字符串只是代码在写的时候不太一样。
把这个咱们cut了这个模块儿咱不需要去导入。 然后呢咱们把这个文件的服务跑起来这儿响应我写一个 new 保存首先咱们先把这个 05 的先停了来一个 NODE 06 table 敲回车儿 打开浏览器咱们去访问一下子好看一下 URL new 没有问题那么新方式怎么去提取呢 首先我们在这里来去实例化一个 URL 的对象你注意这个 URL 跟刚才上个小节用那个 URL 是不太一样的。好来个 let url 等于一个 new 的url 这个 URL 它在实例化的时候可以接收一个参数也可以接收两个参数。
如果说你要是传一个比如说你这么去写咱来一个 3W 点百度.com举个例子其实可以随便写然后后边跟一个路径比如说来一个search后边跟一个查询字符串 a 等于 100 and b 等于200。写完之后我们可以来看看这个实例化对象的内容。 好那咱们重新启动一下子然后切过来再重新的发请求一发请求过来之后回到函数执行然后就可以看到结果了。
看到结果之后这里有两个主要还是因为浏览器发了两次请求就是那个 FAV icon 的总共是两个请求。 好我们来看其中一个就可以了你会发现这个 URL 里边是一个对象里边有比如说这个协议是吧然后还有这个域名儿还有这个路径还有查询字符串儿是吧都是有的这是传入一个参数的方式。 那如果说你看如果我们光传这个光传路径和查询字符串儿就是没有传协议域名和端口它能不能解析呢咱来看一下摁上敲回车切过来再发请求你会发现这就出问题了啊。他说了什么呀 invalid URL 说兄弟你传的这个并不是一个合法的URL。 那这时候要想他正常去运转我们必须得到后边补上这个协议然后域名当然 IP 也可以不是说必须是域名 IP 也是 OK 的。好再来补上这个端口。 好补完之后咱们再去看这个结果重新启动一下切过来然后发请求你看返回结果没有问题 再切过来看控制台控制台里边也包含了对应的内容有路径然后有查询字符串那有了这个内容做支撑我们想提取路径和查询字符串就变得比较简单了。 怎么来做呢把这块内容咱们复制一份把上面这个注释掉我只要把前面的这块内容给它cut掉把它换成request.url 就可以了。 后边内容其实可以随便写就端口我不写 9, 000我随便写一个就写个127.0.0.1这样行不行这样其实也是 OK 的只要你把它补全成为一个完整的 URL 就可以了。 那补全完毕之后咱们这回来看看效果重启然后切过来浏览器然后发请求注意看路径是search然后 keyword h5 切过来然后看这看第一个然后首先看路径在这儿斜杠 search 没有问题。 我们可以做一个输出像这个样子来输出路径。consult log打印一下子URL. pathname咱们看看好使不好使 然后按上敲回车再来发请求打开这一块看结果看这斜杠 search 斜杠 favicon 没有问题 然后查询字符串这一块该怎么获取大家可以看一下这里有一个 search 属性它是一个字符串形式的查询字符串这个大家用起来不是很方便 但你往下看它还有一个 searchParams 属性这是一个对象这个对象里边它包含了咱这个 keyword 属性还有对应的值H5所以咱们可以借助于这个属性来获得查询字符串当中这个内容。
好那接下来的话咱们再来一个就是输出啥输出这个 keyword 查询字符串怎么来做
注意它跟我们预想的还是不太一样啊。有同学可能会说咱们直接去写 keyword 就行了这样做不行它必须得通过一个方法才能够把这个店名对应的值取出来就是用的 get 括弧把那个键名传进来保存好 现在咱们重新启动一下子打开浏览器然后再发一次请求切过来终端大家看一下一个是 search 是那个路径然后 h5 就是那个keyword它那个值 为什么下边为null因为第二次请求就是那个 FAVicon 请求大家可以看一下这个请求它是不包含 keyword 这个参数的它这个值就是一个 null 值。 好是咱们讲了一下获取路径和查询字符串的另外一种方式。那为什么咱要讲这种方式呢需要大家说一下子咱们打开这个 nodejs 的一个中文站然后点开这个 API 文档。大家同学可能会说哎这之前咱们好像也没有打开过这个网站为什么今天打开了啊这是因为之前他收费他现在他免费了就里边内容可以随便看了所以我们就可以参考他了
原来收费的如果拿过来是吧你们还可能怀疑强哥有一些其他的一些心思是吧
好了那么现在的话咱们可以看一看这个文档它里边有一个 URL 的模块走的 URL 模块然后里边有一个就是这个parse咱们上一个小节用的那个它后边是一个旧版 能看到它给我们来了个建议就是建议你用这个 url 的 api url api 在哪呢
咱们看这看这 URL 类就是我们可以通过实例化的方式去创建一个对象再通过对象里边的属性。 比方说这个什么host 然后 host name 就可以获得这个 URL 里边的相关的内容了。这种提取 URL 里边内容的这个方式在浏览器端它也是可以的就是你在前端 js 也是可以用这种方式去实例化来获得这个 URL 的相关内容的啊。
当然了咱们之前讲这种方法它也是可以用的并且很多包就是很多一些工具在封装时都用了我们那个 parse 方法去做的实现所以两种方法你都可以用。好了关于这个小节咱们提取 URL 路径和查询字符串的另外一种方式我们就先说这么多。