nodejs学习笔记(四)——构造httpserver和httpclient

nodejs虽然是用javascript这种前台脚本语言来写,但它实质上是一种后台语言,本章就来说明一下如何使用nodejs来构造一个httpserver和httpclient。


注意:只有在nodejs中可以用javascript来构造httpserver和httpclient,而这也是依赖nodejs提供的原生http模块来完成的,一般web应用中使用的javascript并不能提供这样的功能(这也体现了nodejs作为后台语言的特性)。


在第一章中有一个起httpserver的例子,但是只说明了如何在浏览器中访问httpserver的方法,但既然nodejs是后台语言,必定可以在nodejs中访问httpserver,接下来给出这样一个例子:


server代码拷贝第一章中的例子:

var http = require('http');  
  
http.createServer(function (request, response) {  
  
    // 发送 HTTP 头部   
    // HTTP 状态值: 200 : OK  
    // 内容类型: text/plain  
    response.writeHead(200, {'Content-Type': 'text/plain'});  
  
    // 发送响应数据 "Hello World"  
    response.end('Hello World\n');  
}).listen(8888);  
  
// 终端打印如下信息  
console.log('Server running at http://127.0.0.1:8888/');  

把server代码保存在在test8.js中,然后通过node test8.js命令来启动httpserver:



client代码:

var http = require('http');

// 用于请求的选项
var options = {
   host: 'localhost',
   port: '8888',
   path: ''  
};

// 处理响应的回调函数
var callback = function(response){
   // 不断更新数据
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // 数据接收完成
      console.log(body);
   });
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();

把client代码保存在在test9.js中,然后另开一个命令行窗口通过node test9.js命令来启动httpclient:



可以看到client成功访问了server并打印了server返回的响应信息。下面用一张图来说明一下client代码:



上例中构造的get请求既没有包含实际的路径(即端口后没有信息,只有一个/)也没有携带参数,下面给出一个包含路径且携带参数的请求响应例子:

server代码(server把请求头信息处理后作为响应消息返回给client):
var http = require('http');  
var url = require('url');
var util = require('util');
  
http.createServer(function (request, response) {  
  
    // 发送 HTTP 头部   
    // HTTP 状态值: 200 : OK  
    // 内容类型: text/plain  
    response.writeHead(200, {'Content-Type': 'text/plain'});  
  
    // 发送响应数据 "Hello World"  
    //response.end('Hello World\n');  
	
    response.end(util.inspect(url.parse(request.url, true)));
}).listen(8888);  
  
// 终端打印如下信息  
console.log('Server running at http://127.0.0.1:8888/');  

把server代码保存在在test8.js中,然后通过node test8.js命令来启动httpserver(如果之前已经启动,则需要停止以后再启动):



client代码:
var http = require('http');

// 用于请求的选项
var options = {
   host: 'localhost',
   port: '8888',
   path: '/test?params1="123"&params2=456'  
};

// 处理响应的回调函数
var callback = function(response){
   // 不断更新数据
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // 数据接收完成
      console.log(body);
   });
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();

把client代码保存在在test9.js中,然后另开一个命令行窗口通过node test9.js命令来启动httpclient(如果之前已经启动,则需要停止以后再启动):



client代码里只有options里的path有变化——get请求url为/test,并携带了两个参数params1和params2,类型分别为字符串和数字:



下面是server代码的变化——去掉了原来的字符串响应信息,取而代之的是请求url对象的字符串信息:



简单补充说明一下url.parse函数和util.inspect函数:

url.parse:获取字符串对应url的完整url对象,第一个为必选参数,表示url对应的字符串,第二个为可选参数(枚举值,true/false),true表示url对象中的query(即get请求携带的参数集合)将被解析为一个字典,false表示将被解析为一个字符串(默认值为false)。其实还有第三个可选参数,在这里就不赘述了,有兴趣的同学自行google一把url模块的API吧。

util.inspect:把任意对象转换为字符串,第一个为必选参数,表示需要转换的对象(在这里为url.parse函数返回的url对象),后面还有三个可选参数,在util模块的API里可以查到。

在nodejs中构造的httpserver和使用通用中间件构造的web application功能是完全一致的,只是通常中间件会帮我们先预处理一把请求,以第二章的web app为例,例子提供了一个/test3的servlet供前台访问,此时如果把前台的请求指向其他不存在的url,会提示404错误(通常表示请求的资源不存在):

控制台打印信息:



网络打印信息:



但是在nodejs中则不会有任何提示,不论我们把client端代码options里的path(对应client需要请求的资源)修改成什么,server端总能响应。server端不仅不会校验请求的资源是否真的存在(除非我们加了校验逻辑),甚至不区分get请求和post请求,下一章会说明nodejs是如何处理(发送和接收)get请求和post请求的。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值