Node.js学习笔记——HTTP拓展2

Node.js学习笔记——HTTP拓展2

  • 发送服务器端响应流
        • response.writeHead(statusCode,[reasonPhrase],[headers])
        • response.setHeader(name,value)
        • response.getHeader(name)
        • response.removeHeader(name)
        • response.headerSent属性
        • sendDate和statusCode
        • response.addTrailers(headers)//用法记得baidu
        • response.write(chunk,[encoding])
        • response.end([chunk],[encoding])
      • response.setTimeout(msecs,[callback])
      • close事件

发送服务器端响应流

createServer的第二个参数为一个http.ServerResponse对象,可以利用该对象发送服务器端响应流。

response.writeHead(statusCode,[reasonPhrase],[headers])

  • statusCode为一个三位的HTTP状态码,如404.
  • reasonPhrase为一个字符串,指定对于该状态码的描述信息
  • headers为一个对象,指定服务器端创建的响应头对象
    响应头中包含的一些常用字段:
    1.content-type:内容类型
    2.location:将客户端重定向到另一个URL地址
    3.content-disposition:指定一个被下载的文件名
    4.set-cookie:用于在客户端创建一个cookie
    5.content-encoding:指定服务器端响应内容的编码方式
    6.Cache-Control:开启缓存机制
    7.Expires:指定缓存过期事件
    8.Etag:指定当服务器端响应内容没有变化时不重新下载数据。

下面在HTML 5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例。由于我们吧服务器的端口指定为1337,并将从端口为5500的网站中运行HTML5页面,因此这是一种跨域操作,需要在HTTP响应头中添加Access-Control-Allow-Origin字段,并且将参数值指定为允许向服务器请求数据的域名和端口号(省略端口号时允许该域名下的任何端口向服务器请求数据,*则允许所有的)

//后端
var http = require('http');
var server = http.createServer(function (req, res) {
    if (req.url !== '/favicon.ico') {
        res.writeHead(200, { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*' });
        res.write('hello');
    }
    res.end();
}).listen(1337, '127.0.0.1');
//前端

<html>
<head>
    <meta charset="utf-8">
    <title>ajaxtitle>
    <script>
        function getData() {
            var xhr=new XMLHttpRequest();
            xhr.open('GET','http://127.0.0.1:1337',true);
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4&&xhr.status==200)
                document.getElementById('div').innerHTML=xhr.responseText;
            }
            xhr.send();
        }
    script>
head>
<body>
    <input type="button" value="getData" onclick="getData()">
    <div id="div">div>
body>
html>

按了getData()以后:
Node.js学习笔记——HTTP拓展2_第1张图片

response.setHeader(name,value)

如果不用writeHead则可以用setHeader;

 res.writeHead(200, { 'Content-Type': 'text/plain' });
 res.setHeader('Content-Type', 'text/plain')

response.getHeader(name)

返回响应头中的某个字段值

response.removeHeader(name)

删除一个响应字段

response.headerSent属性

bool类型:true代表响应头已发送

发送响应头的时机:
writeHead:当该方法被调用时就发送响应头
setHeader:当write方法被第一次调用的时候才发送响应头

sendDate和statusCode

  • senDate为true指HTTP服务器自动将服务器端当前时间作为响应头中的Date字段值发送给客户端。
  • statusCode为状态码

response.addTrailers(headers)//用法记得baidu

在响应数据的尾部追加一个头信息。

response.write(chunk,[encoding])

····发送响应内容。如果在此之前没有writeHead,Node.js将隐式创建一个响应头。

  • chunk可以为字符串或Buffer对象。
  • encoding默认为utf8
  • 在http.ServerResponse对象的end方法结束响应内容的书写之前,可以调用多次write方法

····在第一次调用write的时候,Node.js将立刻发送缓存的响应头信息及write方法中指定的响应内容。后面就只发送write方法中指定的响应内容。响应内容一起缓存在客户端中。
····write方法返回一个bool类型的值。当返回值为true,数据直接发送到操作系统内核缓存区中;当返回值为false,数据首先缓存在内存中。(前者的前提是快速的网络、数据量较少;后者时慢速或数据量大)

response.end([chunk],[encoding])

结束响应的书写。

response.setTimeout(msecs,[callback])

设置响应超时时间。callback无参数。
如果在指定时间内服务器没有做出响应,则响应超时,同时触发http.ServerResponse对象的timeout事件。response.on(‘timeout’,function(){})

注意:如果不设置回调函数,当响应超时的时候会自动关闭与HTTP服务器连接的socket端口;
如果设置了就不会

close事件

在end方法被调用之前,如果连接中断,将触发http.ServerResponse对象的close事件。

var http = require('http');
var server = http.createServer(function (req, res) {
    if (req.url !== '/favicon.ico') {
        res.on('close',function () {console.log('cut');});
        setTimeout(() => {
            res.setHeader('content-type','text/html');
            res.write('hello');
            res.end();
        }, 5000);
    }
}).listen(1337, 'localhost')

在页面打开5秒内删掉页面,console会输出cut

你可能感兴趣的:(Node.js学习笔记——HTTP拓展2)