nodejs模块之http&&url

我们使用nodejs中的http模块来进行网络操作

一、什么是HTTP协议:

超文本传输协议(HyperText Transfer Protocol)HTTP假定其下层协议提供可靠传输。

因此,任何能够提供这种保证的协议都可以被其使用。因此也就是使用TCP作为其传输层。

二、HTTP请求和响应报文的结构:

HTTP请求的结构:
请求行        GET /images/logo.gif HTTP/1.1   表示从/images目录下请求logo.gif这个文件
---------------------------------------------------------------------------------
请求头        Accept-Language:en……
---------------------------------------------------------------------------------
空行         区分请求头和请求主体
---------------------------------------------------------------------------------
请求主体       请求中的内容

 

HTTP响应的结构:
响应行:    HTTP/1.1  200  OK
               版本号 状态码 相应文本
---------------------------------------------------------------------------------
响应头:    content-length:16……
---------------------------------------------------------------------------------
空行      区分响应头和响应主体
---------------------------------------------------------------------------------
响应主体    响应中的内容

三、hTTP协议的特点:

无状态、无连接、HTTP允许传输任意类型的数据对象

简单来说就是无法像我们打电话那样你说一句,我说一句,可以持续通话,而HTTP协议只能做到你说一句,然后我说一句,只后想要通话只能再次建立连接。

然后HTTP对传输数据的的类型不限制,可以是任意类型的。

四、HTTP模块

1、

http.createServer([requestListener])    创建一个监听server,会返回一个http.Server对象,参数requestListener会作为request事件的回调函数,

                 该回调函数第一个参数为http.IncomingMessage实例,第二个参数为http.ServerResponse实例

http.IncomingMessage                     一个对象,封装了客户端发送过来的请求

http.ServerResponse                          响应对象

2、http.Server对象的方法:

on:给监听server添加事件处理函数

listen:使用服务器监听端口

http.Server支持的事件:

request:有请求到来时触发回调函数

close:服务器关闭时触发

3、http.IncomingMessage对象的重要属性、事件和方法:

属性:

req.headers:请求头
req.url:请求路径
req.method:请求方法
req.httpVersion:http协议的版本

事件:

data:接受到请求主体中的内容时会触发
end:请求主体内容接受完毕时触发
这两个配合获取请求主体全部内容

"use strict";

const http = require('http');

const server = http.createServer(function (req, res) {
    // console.log(req.headers);
    // console.log(req.url);
    // console.log(req.method);
    // console.log(req.httpVersion);

    // 获取请求主体内容
    let body = '';
    req.on('data', function (thunk) {
        body += thunk; 
    });
    req.on('end', function () {
        console.log(body);
        res.setHeader('Content-Type', 'text/html');
        res.end('<h1>' + body + '</h1>');
    });
    
});
server.listen(3000);
console.log('server is running in localhost:3000……');

 

4、http.ServerResponse对象方法:

res.end([data][,encoding][,callback])   用于声明整个请求已经发送完毕,同时也可以响应发送数据,每个响应必须调用一次,否则会导致请求持续连接不断的状态
res.write(chunk[,encoding][,callback])    用于往请求主体汇总写入数据,并且调用了这个方法后,响应头以及响应行也不能再操作了(在end前分多次发送数据,必须在end前调用)
res.statusCode <Number> 可操作响应状态码(eg:200,404)(状态码和浏览器显示内容没有关系,一般都是后端设定商量好的,可以是404,单页面显示正常)
res.statusMessage <string> 可操作响应状态信息
res.writeHead(statusCode[,statusMessage][,headers]) 设置请求头部,可以同时设置statusCode、statusMessage、headers,其中headers为一个对象

"use strict";

const http = require('http');

const server = http.createServer(function (req, res) {
    // 设置响应状态码
    res.statusCode = 200;
    // 设置响应状态信息
    res.statusMessage = 'req success';
    // 设置响应头
    res.setHeader('Content-Type', 'text/html');
    // 响应数据,可分多次写入
    res.write('<h1>write01</h1>');
    res.write('<h1>write02</h1>');    
    // 响应
    res.end('<h1>end</h1>');
});

server.listen(3000);
console.log('server is running in localhost:3000……');

 

五、url模块

url.parse(urlString[,parseQueryString[,slashesDenoteHost]])  将一个urlString进行解析

第一个参数是url,第二个参数是一个boolean值,如果为true,则会将url中query解析为一个object返回,如果为false,则返回的query属性值则为一个未解析、未编码的string,默认为false

"use strict";

const http = require('http');
const url = require('url');

const server = http.createServer(function (req, res) {
    const urlObj = url.parse(req.url, true);
    console.log(urlObj); 
    res.end('<h1>parse urlString</h1>');
});

server.listen(3000);
console.log('server is running in localhost:3000……');

 

打印结果为:(标红属性是我们常用的)

Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?name=lyl&age=18',
  query: { name: 'lyl', age: '18' },
  pathname: '/mypage/page01',
  path: '/mypage/page01?name=lyl&age=18',
  href: '/mypage/page01?name=lyl&age=18' 
}

 

 

使用如上这些知识,我们做很多东西:

1、使用url.parse(req,url, true)来解析url,然后根据不同的url来做出不同的响应。

2、我们可以根据不同的url进行路由选择,使用fs模块读取不同html模板文件,获取响应数据,然后对客户端做出响应,从而显示不同页面和数据。

这是最简单的原理,但实现起来从优化、速度等方面总会产生很多问题,但总来来说原理都是这样。

 

-------------------------------------------------------------------------------------------------------------------------end

 

posted @ 2017-07-28 16:30  Walker-lyl  阅读(1419)  评论(0编辑  收藏  举报