NodeJS学习笔记——HTTP模块

作为构建web服务器的核心模块,HTTP模块封装了很多底层的操作,让我们很方便的构建一个http服务器;
下面看一个例子:

var http = require('http');

http
    .createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write('Hello world');
        res.end();
    })
    .listen(2017);

http构建一个服务器,添加回调函数,参数包含request和response,并监听2017端口;
http可以作为服务端客户端来使用;

作为服务端

http.createServer([requestListener])、http.Server类

返回一个新建的http.Server实例,其requestListener函数会被自动添加到request事件;
http.Server实例的request事件表示,每接收到一个请求时触发;回调函数有两个参数,分别是request和response,分别是http.IncomingMessagehttp.ServerResponse的实例;

http.IncomingMessage

对象由 http.Server
http.ClientRequest
创建,并作为第一个参数分别递给 'request'
'response'
事件。 它可以用来访问响应状态、消息头、以及数据。
它实现了 可读流 接口,还有以下额外的事件、方法、以及属性。

基本的一些属性有

  • message.headers请求头或响应头的对象
  • message.method请求的方法
  • message.url请求的url字符串

http.ServerResponse

该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 'request'
事件。
这个类实现了(而不是继承自)可写流 接口。 它是一个有以下事件的 EventEmitter
:...

基本方法有:

  • response.writeHead()
  • response.write()
  • response.end([data][, encoding][, callback])
response.write(statusCode[, statusMessage][, headers])

发送一个响应头给请求。 状态码是一个三位数的 HTTP 状态码,如 404。 最后一个参数 headers 是响应头。 第二个参数 statusMessage 是可选的状态描述。
例子:

const body = 'hello world';
response.writeHead(200, {
  'Content-Length': Buffer.byteLength(body),
  'Content-Type': 'text/plain' });

该方法在消息中只能被调用一次,且必须在 response.end()
被调用之前调用。
如果在调用该方法之前调用 response.write()
response.end()
,则隐式的响应头会被处理并调用该函数。

response.setHeader()
设置的响应头会与 response.writeHead()
设置的响应头合并,且 response.writeHead()
的优先。

response.write(chunk[, encoding][, callback])

如果该方法被调用且 response.writeHead()
没有被调用,则它会切换到隐式响应头模式并刷新隐式响应头。
该方法会发送一块响应主体。 它可被多次调用,以便提供连续的响应主体片段。
Note that in the httpmodule, the response body is omitted when the request is a HEAD request. Similarly, the 204and 304responses must not include a message body.
chunk可以是一个字符串或一个 buffer。 如果 chunk是一个字符串,则第二个参数指定如何将它编码成一个字节流。 encoding默认为 'utf8'。当数据块被刷新时,callback会被调用。
注意:这是原始的 HTTP 主体,且与可能被使用的高级主体编码无关。
response.write()
首次被调用时,会发送缓冲的响应头信息和响应主体的第一块数据到客户端。 response.write()
第二次被调用时,Node.js 会以流的形式处理数据,并将它们分别发送。 也就是说,响应会被缓冲到响应主体的第一个数据块。
如果全部数据被成功刷新到内核缓冲区,则返回 true。 如果全部或部分数据还在内存中排队,则返回 false。 当缓冲区再次空闲时,则触发 'drain'事件。

response.end([data][, encoding][, callback])

该方法会通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。 每次响应都必须调用 response.end()方法。如果指定了 data,则相当于调用 response.write(data, encoding)
之后再调用 response.end(callback)。如果指定了 callback,则当响应流结束时被调用。

作为客户端

http.ClientRequest 类

该对象在 http.request()
内部被创建并返回。 它表示着一个正在处理的请求,其请求头已进入队列。
要获取响应,需为 'response'
事件添加一个监听器到请求对象上。 当响应头被接收到时,'response'
事件会从请求对象上被触发 。 'response'
事件被执行时带有一个参数,该参数是一个 http.IncomingMessage
实例。
'response'
事件期间,可以添加监听器到响应对象上,比如监听 'data'事件。
如果没有添加 response事件处理函数,则响应会被整个丢弃。 如果添加了 response事件处理函数,则必须消耗完响应对象的数据,可通过调用 response.read()、或添加一个 'data'事件处理函数、或调用 .resume() 方法。 数据被消耗完时会触发 'end'事件。 在数据被读取完之前会消耗内存,可能会造成 'process out of memory'错误。
下面来看一个小爬虫的实例:

var http = require('http');

var url = 'http://www.imooc.com';

http.get(url,function(res) {
    var html = '';

    res.on('data',function(data) {
        html += data;
    });

    res.on('end',function () {
        console.log(html);//输出慕课网的html代码
    })
}).on('error',function() {
    console.log('获取错误');
});

注:作为客户端的res和服务端的res参数不同,实际上,这里的res和服务端的req是同一个类型的实例,即:http.IncomingRequest

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容