Node.js HTTP模块

内置HTTP模块

Node.js 中有 HTTP 这个内置模块,HTTP 模块允许 Node.js 通过超文本传输协议(HTTP)传输数据。

如果要使用 HTTP 模块,需要先通过 require() 方法引入 HTTP 模块,如下所示:

var http = require('http');

简单服务器的创建

Node.js 中的 HTTP 模块可以创建一个 HTTP 服务器,该服务器侦听服务器端口并将响应返回给客户端。

示例:

使用createServer()方法创建HTTP服务器,如下所示:

var http = require('http');
http.createServer(function (req, res) {
  res.write('Hello xkd'); 
  res.end(); 
}).listen(8888); 

在命令工具中启动 Node.js 文件(你自定义的文件名),打开浏览器,访问http://127.0.0.1:8888/,就可以看到浏览器页面中会显示”Hello xkd“,这样一个最简单的服务器搭建成功了。

Node.js 中的 HTTP 模块中封装了一个 HTTP 服务器和一个简单的 HTTP 客户端,http.Server 是一个基于事件的 HTTP 服务器,http.request 则是一个 HTTP 客户端工具,用于向 HTTP 服务器发起请求。createServer() 方法中的两个参数 req 和 res 分别代表了请求对象和响应对象。其中 req 是 http.IncomingMessage 的实例,res 是 http.ServerResponse 的实例。

HTTP服务器

除了可以使用 createServer() 方法返回一个 http.Server 对象来创建服务器,我们还可以使用下列方法来实现。

示例:

创建一个http.Server对象,然后为其添加request事件监听:

var http = require("http");
var server = new http.Server();

server.on("request",function(req,res){
    res.writeHead(200,{        
      "content-type":"text/plain; charset=utf-8"
    });
    res.write("xkd");
    res.end();
});
server.listen(8888);
http.Server的事件

http.Server 是一个基于事件的服务器,继承自 EventEmitter。http.Server 提供的事件如下所示:

  • request:当客户端请求到来时,该事件被触发,提供两个参数req和res,表示请求和响应信息,是最常用的事件。

  • connection:当TCP连接建立时,该事件被触发,提供一个参数socket,是net.Socket的实例。

  • close:当服务器关闭时,触发事件(注意不是在用户断开连接时)。

HTTP客户端

http 模块提供了两个函数 http.request 和 http.get,功能是作为客户端向 http 服务器发起请求。

http.request(option,callback)

http.request() 方法接受两个参数,其中参数 option 是一个类似关联数组的对象,表示请求的参数。callback 是请求的回调函数,需要传递一个参数。

示例:

var http=require('http');
var querystring=require('querystring');
//启动服务
http.createServer(function(req,res){
    console.log('开始请求,解析参数');
    //解析post请求
    var post='';
    req.on('data',function(chunk){
        post+=chunk;
    });
    req.on('end',function(){
        post=querystring.parse(post);
        //解析完成
        console.log('参数解析完成,返回name参数');
        res.end(post.name);
    });
}).listen(8888);
 
 
//客户端请求
var contents=querystring.stringify({
    name:'Tom',
    age:18,
    city:'beijing'
});

//声明请求参数
var options={
    host:'localhost',
    path:'/',
    port:8888,
    method:'POST',
    headers:{
        'Content-Type':'application/x-www-form-urlencoded',
        'Content-Length':contents.length
    }
};
//发送请求
var req=http.request(options,function(res){
    res.setEncoding('utf-8');
    res.on('data',function(data){
        console.log('后台返回数据');
        console.log('name参数的值为:' + data);
    })
});
req.write(contents);
//必须调用end()
req.end();

然后启动 Node.js 文件,会输出如下内容:

> node file.js
开始请求,解析参数
参数解析完成,返回name参数
后台返回数据
name参数的值为:Tom
http.get(option,callback)

http.get() 方法是 http.request 方法的简化版,唯一区别只是 http.get 自动将请求方法设为了 GET 请求,同时不需要手动调用 req.end()。如果我们使用 http.request 方法时没有调用 end 方法,服务器将不会收到信息。

示例:
var http=require('http');
var url=require('url');
var util=require('util');
//启动服务
http.createServer(function(req,res){
    console.log('开始请求,解析参数');
    var params=url.parse(req.url,true);
    console.log('解析完成');
    console.log(util.inspect(params));
    console.log('向客户端返回name');
    res.end(params.query.name);
}).listen(8888);
 
//客户端请求
var request=http.get({
    host:'localhost',
    path:'/user?name=Tom&age=18&city=beijing',
    port:8888},function(res){
    res.setEncoding('utf-8');
    res.on('data',function(data){
        console.log('服务端相应name值为:'+data);
    })
});

然后启动 Node.js 文件,会输出如下内容:

>node file.js
开始请求,解析参数
解析完成
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?name=Tom&age=18&city=beijing',
  query: { name: 'Tom', age: '18', city: 'beijing' },
  pathname: '/user',
  path: '/user?name=Tom&age=18&city=beijing',
  href: '/user?name=Tom&age=18&city=beijing' }
向客户端返回name
服务端相应name值为:Tom

更多可以查看:https://www.9xkd.com/3716132715.html

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

推荐阅读更多精彩内容