服务器 #

珠峰培训就是一个服务器
回龙观东大街2楼203(地点和门牌号)
有人要听不同的课程,就提供不同的课程(满足学员们的要求)

客户端 #

只要能向特定IP(服务器)特定端口发起请求并接受响应的都叫客户端
可以是mac、iphone、ipad、apple等等

数据的传递 #

一个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成

1.http和https #

1.1 http #

1.2 https #

确保安全的HTTPS
HTTP+加密+认证+完整性保护=HTTPS

示意图

2.网站的访问流程 #

2.1 发送请求 #

2.2 得到相应 #

3.创建服务 #

var http = require('http');
http.createServer(function (req,res) {
    res.end('你好');
}).listen(8080);

响应中文出现乱码问题

3.1 设置响应头 #

res.setHeader('Content-type','text/plain;charset=utf8');
res.statusCode = 200;
res.writeHead(200,{'Content-type':'text/plain;charset=utf8'});

可以返回html文件

var fs = require('fs');
fs.createReadStream('./index.html').pipe(response);

页面中的js,css返回的均为html;需要根据路径返回不同的内容

3.2 请求信息 #

请求路径

console.log(req.url);

请求方法

console.log(req.method);

请求头信息

console.log(req.headers);

3.3 http服务 #

var http = require('http');
var fs = require('fs');
http.createServer(function (request,response) {
if(request.url=='/hello.html'){
    response.setHeader('Content-type','text/html;charset=utf8');
    fs.createReadStream('./hello.html').pipe(response);
}else if(request.url=='/favicon.ico'){
    response.statusCode = '404';
    response.end('');
}else if(request.url=='/style.css'){
    response.setHeader('Content-type','text/css;charset=utf8');
    fs.createReadStream('./style.css').pipe(response);
}else if(request.url=='/index.js'){
    response.setHeader('Content-type','application/x-javascript;charset=utf8');
    fs.createReadStream('./index.js').pipe(response);
}).listen(8080)

3.4 路径参数 #

当访问路径时带有查询参数,无法访问到正确路径

3.4.1 url模块 #

url.parse第二个参数将query变为对象格式

var url = require('url');
console.log(url.parse(path,true));
Url {
    protocol: 'http:', 协议
    slashes: true,  是否有//
    auth: null, 用户名密码
    host: 'zhidao.baidu.com', 主机
    port: null, 80 端口
    hostname: 'zhidao.baidu.com', 主机名
    hash: null, hash值
    search: '?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 路径和和hash值之间的
    query: 'lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 同过true转换成对象
    pathname: '/search',  路径
    path: '/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 路径+查询字符串
    href: 'http://zhidao.baidu.com/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd' }

根据pathname来进行路径的判断

3.5 改造服务 #

var urlObj  = url.parse(request.url,true);
var pathname = urlObj.pathname;
if(pathname=='/'){
    response.setHeader('Content-type','text/html;charset=utf8');
    fs.createReadStream('./index.html').pipe(response);
}else if(pathname=='/style.css'){
     response.setHeader('Content-type','text/css;charset=utf8');
     fs.createReadStream('./style.css').pipe(response);
}

3.6 合并冗余代码 #

var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var mime = {
    '.html':'text/html',
    '.js':'application/x-javascript',
    '.css':'text/css',
}
http.createServer(function (request,response) {
 var urlObj  = url.parse(request.url,true);
    var pathname = urlObj.pathname;
if(pathname=='/'){
    response.setHeader('Content-type','text/html;charset=utf8');
    fs.createReadStream('./index.html').pipe(response);
}else if(pathname=='/favicon.ico'){
    response.statusCode = 404;
    response.end('');
}else{
    response.setHeader('Content-type',mime[path.extname(pathname)]+';charset=utf8');
    fs.createReadStream('.'+pathname).pipe(response);
}
}).listen(8080);

3.7 使用mime模块 #

3.7.1 安装mime #

$ npm install mime

3.7.2 使用mime #

var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var mime = require('mime');
http.createServer(function (request,response) {
    var urlObj  = url.parse(request.url,true);
    var pathname = urlObj.pathname;
    if(pathname=='/'){
        response.setHeader('Content-type','text/html;charset=utf8');
        fs.createReadStream('./index.html').pipe(response);
    }else {
        var flag = fs.existsSync('./' + pathname);
        if (flag) {
            response.setHeader('Content-type', mime.lookup(pathname) + ';charset=utf8');
            fs.createReadStream('.' + pathname).pipe(response);
        } else {
            response.statusCode = 404;
            response.end();
        }
    }
}).listen(8080);

4.请求方式 #

发送HTTP的方法有许多种,最常用的便是GETPOST,下面就这两种进行详细地说明。

其他常用方法 #

方法 用法
GET 向服务器获取资源
POST 向服务器发送数据
DELETE 从服务器上删除资源
HEAD 仅向服务器获取响应头,不要响应体
PUT 更新服务器上的一个资源
OPTOINS 获取服务器上可以支持的方法

5.常见的状态码 #

示意图

6. 查询字符串 #

querystring用来对查询字符串进行转换

var queryObj = querystring.parse(str,[sep],[eq]); //字符串转对象
var queryStr = querystring.stringify(obj,[sep],[eq]); //对象转字符串

7. 抓取页面中的h3 #

var http = require('http');
http.createServer(function (request,response) {
    var strLar = `<!DOCTYPE html>\
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <div></div>
    </body>
    </html>`;
    http.get('http://baijia.baidu.com', function (res) {
        var result = '';
        res.on('data', function (data) {
            result+=data;
        });
        res.on('end', function () {
            var arr = result.match(/<h3[\S\s]*?<\/h3>/g);
            var str = '<ul>';
            arr.forEach(function (item) {
                str+='<li>'+item+'</li>'
            });
            str += '</ul>';
            strLar = strLar.replace('<div></div>',str);
            response.end(strLar);
        });
    });
}).listen(8080);