Node.js学习笔记——HTTP拓展2
发送服务器端响应流
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');
//前端
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ajax</title>
<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()以后:
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