专业
服务器也可以是个人
电脑特定IP(服务器)
的特定端口
上监听客户端的请求,并根据请求的路径返回相应结果都叫服务器 珠峰培训就是一个服务器
回龙观东大街2楼203(地点和门牌号)
有人要听不同的课程,就提供不同的课程(满足学员们的要求)
只要能向特定IP(服务器)
的特定端口
发起请求并接受响应的都叫客户端
可以是mac、iphone、ipad、apple等等
已经有的静态文件
发送给客户端动态内容
返回给客户端,比如当前时间
一个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成
传输手段
(声波)和一种彼此都懂的语言
(比如普通话)协议
(比如 HTTP/HTTPS)和一种数据封装格式
(比如 HTML/JSON)确保安全的HTTPS
HTTP+加密+认证+完整性保护=HTTPS
HTTP请求
域名解析为IP地址
(chrome缓存1分钟(chrome://net-internals/#dns)->搜索操作系统缓存->读取本地host文件->发起DNS系统调用->运营商DNS缓存)TCP连接
发送HTTP请求
了生成完整响应
页面响应体
,根据不同的处理结果生成响应头
,发回给客户端解析
引用的服务器上的资源
(额外的 CSS、JS代码,图片、音视频,附件等),再向服务器发送请求渲染
,JS 代码也可能会对外观进行一定的处理
页面交互
(点击,悬停等等)时,JS 代码对此作出一定的反应,添加特效与动画AJAX
请求修改DOM结构
。var http = require('http');
http.createServer(function (req,res) {
res.end('你好');
}).listen(8080);
响应中文出现乱码问题
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;需要根据路径返回不同的内容
请求路径
console.log(req.url);
请求方法
console.log(req.method);
请求头信息
console.log(req.headers);
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)
当访问路径时带有查询参数,无法访问到正确路径
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来进行路径的判断
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);
}
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);
$ npm install 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);
发送HTTP的方法有许多种,最常用的便是GET
和POST
,下面就这两种进行详细地说明。
GET
GET方法用来请求访问URI所指定的资源,(我想访问你的某个资源)并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同的。GET方式把请求所需要的参数放到URL中,直接就可以在URL中看见,有大小限制。
POST
POST方法用来传输实体主体,目的并不是获取响应
的主体内容,(我要把这条信息告诉你),POST方式则是把内容放在报文内容中,因此只要报文的内容没有限制,它的大小就没有限制。
总结
GET用于获取某个内容,POST用于提交某种数据请求。
按照使用场景来说,一般用户注册的内容属于私密的,这应该使用POST方式;而针对某一内容的查询,为了快速的响应,可以使用GET方式。
方法 | 用法 |
---|---|
GET | 向服务器获取 资源 |
POST | 向服务器发送 数据 |
DELETE | 从服务器上删除 资源 |
HEAD | 仅向服务器获取响应头 ,不要响应体 |
PUT | 更新 服务器上的一个资源 |
OPTOINS | 获取服务器上可以支持 的方法 |
querystring用来对查询字符串进行转换
var queryObj = querystring.parse(str,[sep],[eq]); //字符串转对象
var queryStr = querystring.stringify(obj,[sep],[eq]); //对象转字符串
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);