http协议的API
1.http.createServer([requestListener])
它是http模块的一个静态方法。
参数requestListener
是一个会被自动添加到 request 事件中的函数,request事件触发的函数第一个参数为:
request
<http.IncomingMessage>
response
<http.ServerResponse>
解释 :request事件是每次接收到一个请求时触发, 注意,每个连接可能有多个请求(在 HTTP keep-alive
连接的情况下)。
一般requestListener如下:
function(req, res, next) { // req是http.IncomingMessage的实例。 app.handle(req, res, next); };
返回为http.server,它是由net.Server 类继承过来。
2.express中res对象是http.ServerResponse的一个实例。
这个对象通常由HTTP SERVER
建立而非用户手动建立, serverResponse有如下事件和方法:
'close' 事件 'finish' 事件 response.addTrailers(headers) response.end([data][, encoding][, callback]) response.finished response.getHeader(name) response.headersSent response.removeHeader(name) response.sendDate response.setHeader(name, value) response.setTimeout(msecs, callback) response.statusCode response.statusMessage response.write(chunk[, encoding][, callback]) response.writeContinue() response.writeHead(statusCode[, statusMessage][, headers])
对象的创建源码是:
var res = new ServerResponse(req);
它继承OutgoingMessage,而且end()
正是 OutgoingMessage.prototype.end()
3.req
(1)req是http.IncomingMessage 类的一个实例, http.IncomingMessage类(对象)也是HTTP模块对TCP连接的读操作(实现了可读流接口)的封装。
成员:1:headers(请求/响应头的对象)。报头名称和值的键值对,报头名称为小写!
2:url 它是请求的 URL 字符串,仅包含 HTTP 请求实际存在的 URL,注意:它不含域名:类似/m/login.html,第一个字符为“/”。
事件:1:abort事件
2:close事件
4.http.ClientRequest
对象
2.第二种情况就是客户端发出http请 求的 http.request()方法的返回结果,也可以是(
http.get)
var http=require('http'); var options={ hostname:'localhost', port:1337, path:'/', method:'GET' }; var req=http.request(options,function(res){ //获取到服务器的返回数据 res.on('data',function(chunk){ //这里的chunk是Buffer对象,这一点一定要注意是编码的数据 console.log(res instanceof http.IncomingMessage); //这里打印true }) }) req.end(); //必须调用,否则客户端不会发送请求到服务
http.ClientRequest
对象在 http.request()
内部被创建并返回,它用于写入HTTP客户端请求数据,一般用在设置代理服务器,也就是说:req代表客户端请求的一个可写入的对象,在nodejs内部创建。
一个http是如何解析socket数据和处理业务函数、响应客户端的请求,参考:http://www.xiedacon.com/2017/08/18/Node.js%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-HTTP%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94%E8%BF%87%E7%A8%8B/#Base
5.获取机器的IP值
exports.getCurrentIp = function(){ /** * 系统模块 * @type {Object} */ var os = require('os'); /** * 获得系统的网卡列表 * @type {Object} */ var ipObj = os.networkInterfaces(); //获取系统的网卡 var result = []; for(var i in ipObj) { // 获得某个网卡下面的ip列表 var ipList = ipObj[i]; for(var j = 0; j < ipList.length; j += 1) { // 某个网卡的某个ip var ip = ipList[j]; //result中保存的是IPv4的地址 if(ip.family === 'IPv4') { result.push(ip.address); } } } return result; };