• 原生node的header


    首先引入http模块

    获取http.ServerResponse对象的方式,
    1.http.createServer(function(req,res){}) 其中res是http.ServerResponse对象

    2.var server = http.createServer().listen(9332,'localhost')
       server.on('request',function(req,res){})    server的request对象的request事件中,res为http.ServerResponse对象

    http.ServerResponse对象的方法:

    1.报头:

        1.writeHead()

        2.setHeader()

        3.getHeader(类型参数)

        4.removeHeader()

        5.addTrailers()    追加头信息

    2.报文

        1.write() 报文内容,返回值是true/false

      2.end()   结束响应,必须调用end()方法,否则是超时,没有响应.

        3.setTimeout()    服务器没有响应时,触发这个事件.

    http.ServerResponse对象的属性:

        1.headerSent      当头部已经有响应后,res.headerSent 为true 否则为false.可以通过这个属性来判断是否已经响应.

        2.statusCode

        3.sendDate         true/fasle   当为false时,将删除头部时间

    http.ServerResponse监听的事件

        1.timeout事件

        2.close事件

        3.request事件

        4.checkContinue事件

        5.connect事件

        6.clientError事件

    设置头部信息,有两个方法:

      1.setHeader(name,value)方法可以调用多次,但真正写入到头部的必须调用一次writeHead()

      2.http.ServerResponse.writeHead(statusCode[,reasonPhrase][,headers]) 其中headers 为设置的头对象

          3.设置的头部信息的内容:

              content-type: 内容类型, [type]/[subtype]; parameter

          location: 将客户端的请求重定向

        content-disposition: 指定一个被下载的文件名

              content-length: 服务器响应的字段数

              set-cookie:设置cookie

              Cache-Control: 开启缓存

              Expires:缓存失效时间

              Etag:当服务器没有变化时,不重新下载文件

    (1)content-type的类型,这是几个大类,然后后面是具体的小类:

        Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; 

        Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据; 

        Application:用于传输应用程序数据或者二进制数据; 

        Message:用于包装一个E-mail消息; 

        Image:用于传输静态图片数据; 

        Audio:用于传输音频或者音声数据; 

        Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。 

    (2)通常还有一些设置跨域的内容:

        res.setHeader("Access-Control-Allow-Origin", "*");

        res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");

        res.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");

    报文信息:

    在调用res.end()之前可以多次调用res.write()方法,res.write()返回一个true/fasle,

    当没有响应或者超时时(这种情况遇到很多次,进程没有挂掉,一直处在无响应,但是客户端一直可以请求),res.setTimeout(毫秒数,callback),当超时时,会触发res.on(timeout,function(){}),如果没有回调函数,则自动调用end()结束请求.

    当网络较好,数据量较少时,,将数据直接发送到上操作系统的内核缓存区,然后从内核缓存去取出数据发送给对方.返回值是true

    当数据比较大,网速慢时,先将数据缓存在内存中,如果客户端可以接收数据了,再将数据发送到内核缓存区中,最后发送给对方.返回值是false

    因此在大量数据的时候,会有内存爆满.

    这是在并发情况下的用async做的控制,

    当集合中元素很多,不能一次全部并行操作,又不想一个一个按顺序来,可以使用forEachLimit函数。它可以设定一批处理几个,每一批内并行执行,批与批之间顺序执行。

    async.forEachLimit(eles, 5000, (list, cb) => {
        // do something;
    }); 
     

    获取req的报文信息 

    通过req.对象来获取(req对象参考上面的获取方法)

    req.属性包含以下属性:

    1.method:客户端请求的方法

    2.url:客户端请求的url

    3.headers:请求头对象,包含cookies和浏览器信息(报文) 

               Connection:keep-alive

        Content-Length:874

        Content-Type:application/json; charset=utf-8

        Date:Fri, 20 Jan 2017 03:25:38 GMT

        ETag:W/"36a-yQDJ0iz/THXt81YLCAOKTg"

        Vary:X-HTTP-Method-Override

        Via:1.0 am-forward (squid/3.1.23)

        X-Cache:MISS from am-forward

        X-Cache-Lookup:MISS from am-forward:3128

        X-powered-by:www.yunshipei.com

               accept-encoding: 'gzip, deflate, sdch'                  //说明浏览器支持的压缩格式

     httpVersion: http协议版本号

    socket:客户端监听的socket对象

    对于传输的压缩的处理请参考:http://www.poluoluo.com/jzxy/201504/353581.html.这时不仅要判断content-encoding还要与客户端协商一致.

     获取部分内容

     在头部中设置:

          1.Range: bytes=5001-10000   //5001-10000字节

          2.Range: bytes=5001-           //5001字节以后的

          3.Range: bytes=-3000,5000-7000 //从一开始到3000字节和5000-7000字节

  • 相关阅读:
    python 各层级目录下的import方法
    Ubuntu更新python3.5到python3.7
    程序员的江湖--个人品牌
    产品经理看哪吒之魔童降世
    Python 相对路径和绝对路径--python实战(九)
    vim 下修改tab键为四个空格
    一个python问题引发的思考
    【python】多进程共享变量
    【python】spark+kafka使用
    【python】kafka在与celery和gevent连用时遇到的问题
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/6229139.html
Copyright © 2020-2023  润新知