node.js第十课(HTTPserver)

node.js第十课(HTTPserver)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。



概念:Node.js提供了http模块。当中封装了一个高效的HTTPserver和一个简单的HTTPclient。
    http.server是一个基于事件的HTTP服务器。内部用C++实现。接口由JavaScript封装。
    http.request则是一个HTTPclient工具。用户向server发送请求。
一、HTTPserver
    http.Server实现的,它提供了一套封装级别非常低的API,不过流控制和简单的解析,全部的高层功能都须要通过它的接口
    前面解说的app.js案例
    代码分析:
    http.createServer创建了一个http.Server的实例,将一个函数作为HTTP请求处理函数。这个函数接受两个參数,请求对象req和响应对象的res。
    res显式写入了响应代码200(表示请求成功),指定响应头,写入响应体。调用end结束并发送。该实例调用listen函数,启动server并监听3000port。
  1.http.Server的事件
    http.Server是一个基于事件的HTTPserver,全部请求都被封装到独立的事件,开发人员仅仅要对它的事件编写对应的函数就可以实现HTTPserver的全部功能,
    它继承与EventEmitter,提供了下面事件:
        request:当client请求到来时,该事件被触发,提供两个參数req和res,各自是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。
        connection:当TCP连接建立时,该事件被触发,提供一个參数socket,为net.Socket的实例(底层协议对象)。
        close:当server关闭时,该事件被触发。
    除此之外还有checkContinue、upgrade、clientError事件。
    最经常使用和关心的是:request事件,http提供了一个捷径,http.createServer([requestListener])
    显式实现方法:
    案例:server.js
    var http = require(‘http’);
    var server = new http.Server();
    server.on(‘request’,function(req,res){
        res.writeHead(200,{‘Content-Type’:’text/html’});
        res.write(‘<h1>NODE.JS</h1>’);
        res.end(‘<p>hello,world</p>’);
    });
    server.listen(3000);
  2.http.ServerRequest请求的信息
    此对象是后端开发人员最关注的内容,它一般由http.Server的request对象发送,作为第一个參数传递,通常简写成request或req。
    HTTP请求分为两部分:请求头和请求体。,请求内容短的直接在请求头解析完毕后马上读取,而请求体可能相对较长,须要一定的时间传输,因此提供了3个事件用于控制请求体传输。
    (1)data:当请求体数据到来时,该事件被触发,该事件一共一个參数chunk,表示接受到的数据。
    (2)end:当请求体传输数据完毕时,该事件被触发,此后将不会再有数据到来。
    (3)close:用户当前请求结束时,该事件被触发,不同于end,假设用户强制终止了传输,也会触发close
        ServerReuqest的属性
            complete:client请求是否已经发送完毕
            httpVersion   HTTP协议版本号,一般是1.0或1.1
            method        HTTP请求方法,如:GET,POST
            url           原始的请求路径,比如/pc/getUser或/user?name=marico
            headers       HTTP请求头
            trailers      HTTP请求尾(不常见)
            connection    当前HTTP连接套接字,为net.Socket的实例
            socket        connection属性的别名
            client        client属性的别名
  3.获取GET请求内容
    因为GET请求直接被嵌入在路径中,URL完整的请求路径,包含了?后面的部分,因此你能够手动解析后面的内容作为GET的參数,Nodejs的url模块中的parse函数提供了这个功能
    实例:get.js
 var http=require(‘http’);
        var urls=require(‘url’);
     var util=require(‘util’);

    http.createServer(function(req,res){
         res.writeHead(200,{‘Content-Type’:’text/plain’});
        res.end(util.inspect(urls.parse(req.url,true)));
 }).listen(3000);
  4.获取POST请求内容
    POST请求的内容所有都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。
    恶意的POST请求会大大消耗server的资源。所以Nodejs是不会解析请求体,当你须要的时候,须要手动来做。
    实例:post.js
    var http=require(‘http’);
    var querystring=require(‘querystring’);
    var util=require(‘util’);
    http.createServer(function(req,res){
        var post=”;
        //注冊data事件监听函数,每当接受请求体的数据
        req.on(‘data’,function(chunk){
            post+=chunk;
        });
        req.on(‘end’,function(){
     //解析成字符串格式的post为真正的post请求格式
     post=querystring.parse(post);
     //向前端返回
     res.end(util.inspect(post));
        });
    }).listen(3000);
  5.http.ServerResponse返回给client的信息
    决定了用户终于能到的结果,它是由http.Server的reponse对象发送的,作为第二个參数传递。一般为response或res
    基本的三个函数:
    response.writeHead(statusCode,[headers]):向请求的client发送响应头。
    statusCode是HTTP的状态码,如200为成功,404未找到等。
    headers是一个类似关联数组的对象,表示响应头的每一个属性。
    response.write(data,[encoding]) 向请求client发送对应内容,data是buffer或字符串,encoding为编码
    response.end([data],[encoding]) 结束响应,告知用户全部发送已经完毕,当全部要返回的内容发送完毕,该函数必须被调用一次,假设不调用,client永远处于等待状态
                   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118461.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 免备案CDN推荐+教程

    免备案CDN推荐+教程文章目录前言一、CDN1.注册2.配置二、域名解析三、Nginx配置修改前言最近在搭建个人博客,到备案的时候发现困难重重(很麻烦),然后就想着用点其他法子。于是乎网上搜到了这个免备案CDN,花了一会部署完成后,感觉还不错就记录下来。附上我的博客链接:chasezc,功能还不是很完善,还在继续补充。一、CDN在网上查到的这个叫Nodecache,主要提供CDN、DNS、SSL证书等业务,亚太节点有我们喜欢的香港线路,速度很不错。1.注册首先我们去官网上注册:https://www.node

  • settimeout()停止_需求方案

    settimeout()停止_需求方案转载https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/在管理setTimeout&amp;setInterval这两个APIs时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员——{sto,siv},用它们来分别存储需要管理的setTimeoutID/…

  • style对象的cssText方法

    style对象的cssText方法cssText本质是什么?  cssText的本质就是设置HTML元素的style属性值。cssText怎么用?domElement.style.cssText=”color:…

  • datagrip2022.01.12最新激活码【最新永久激活】「建议收藏」

    (datagrip2022.01.12最新激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~41MD9IQHZL-eyJsaWNlbnNlSWQiOi…

  • jrtplib 编译安装配置[通俗易懂]

    jrtplib 编译安装配置[通俗易懂]  RTP是目前解决流媒体实时传输问题的最好办法,而JRTPLIB是一个用C++语言实现的RTP库,包括UDP通讯,它的主页地址是:Jori’spage  jrtplib源码的获取,可以在它的主页上直接下载,也可以使用git直接克隆一份。因为它的主页是国外网站,下载速度非常慢,我这里提供一份已经下载好的最新的jrtplib源码:jrtplib-3.11.1.tar.gz  我…

  • 华为私有云的搭建方案_华为私有云解决方案

    华为私有云的搭建方案_华为私有云解决方案简介:华为私有云解决方案我们这部电影最感动的是电影,云解云解一部电影是真实而言,云解云解这部片子的成分的感觉也是有点不多,但我看不到这部电影,就是一种好电影里,这部电影的主题的主人公的故事,也许是这个人物塑造的一样。但是这部电影的原型是真实,这部电影有现实主义,是一个人物的故事也让人感受到了一种感情的转变。我不是药神,他们也不会想到一个人的生活,这部作品,也许这样的影片的最后我觉得这。我们就要吃饭…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号