HTTP前置知识
1 什么是url?
统⼀资源定位符是对可以从互联⽹上得到的资源的位置和访问⽅法的⼀种简洁的表示,是互联⽹上标 准资源的地址。互联⽹上的每个⽂件都有⼀个唯⼀的URL,它包含的信息指出⽂件的位置以及浏览器 应该怎么处理它
2 url包含的内容(这里需要重点理解)
url的形式是这样的: http://nodeing.com/cloud/search?q=html 其中,http://表示协议, nodeing.com 表示域名,/cloud/search表示路由,?号后⾯的叫做查询字符串,还有⼀个默认的值80,表示端⼝, 他应该加在域名的后⾯ http://nodeing.com:80/
2.1 模式/协议(scheme):它告诉浏览器如何处理将要打开的⽂件。最常⽤的模式是超⽂本传输协议 (Hypertext Transfer Protocol,缩写为HTTP),这个协议可以⽤来访问⽹络,这⾥我们要理解⼀下 协议, 通常协议就是双⽅都需要遵守的规则,不同的协议有不同的约束,互联⽹中使⽤的这些协议也 是⼀样,两台计算机之间通信,可以采⽤不同的协议(规则),都遵循同⼀种协议,才能完成某些事情, 例如,我们常⽤的超⽂本传输协议(http)就是在⽹络访问的时候⽤的,ftp协议,⽂件传输⽤的协议, Telnet协议,远程连接⽤的协议等等,总之,你只要记住他们是⼀些都要遵守的规则就⾏了
2.2 域名/ip地址:互联⽹中ip地址就相当于⻔牌号,你想象⼀下你要给某个⼈寄快递,⾸先是不是应 该知道对⽅的地址呢?ip地址的作⽤就是⻔牌号,ip地址的格式是这样的: 192.168.1.123 ,互联⽹上 ip地址成千上万,如果让你去记住每个⽹站的ip地址,肯定是记不住的除⾮你是天才,因此,就有域名 和ip的⼀种映射关系,你可以去注册⼀个域名,和你的电脑(服务器)ip地址绑定,例如:baidu.com <===> 119.75.217.109/,这样我们就不⽤记ip⽽只需要记住域名就可以访问⼀些常⽤⽹站了,这就是 域名和ip的关系,以及作⽤
2.3 端⼝: 这⾥我们说的端⼝指的就是协议端⼝,如果把计算机看作是⼀栋房⼦,那么端⼝就是房⼦ 的⻔,⼀个IP地址的端⼝有65536(2的16次⽅)个,这些端⼝是通过端⼝号来标记的,范围是0~ 65535,既然我们把每个端⼝看作是房⼦的⻔,你可以想象⼀下,⼀栋政府的办公⼤楼⾥⾯,有各种各 样的服务窗⼝,各种各样的科室,每个科室的智能不同,提供的服务也不同,那么同样的道理,计算 机上的这些端⼝也对外提供服务,想要获得服务也必须找到正确的端⼝才⾏,例如:http服务的默认端 ⼝是80,ftp协议的默认端⼝是21,Telnet协议的默认端⼝是23,https协议的默认端⼝是443等等
2.4 ⽂件路径/⽂件名: url的第四部分是你访问资源的⽂件路径和⽂件名,本质上说⼀个⽹站就是放 在服务器上的⽂件夹和⽂件组成的,我们开发⼀个⽹站会有很多的⽬录和⽂件,⾥⾯有我们写好的各 种功能,例如:我们在⼀台服务器(互联⽹上的远程电脑)上部署了我们开发出来的⽹站,实际上就是把 我们开发的⽹站放到了特定的⽬录下
2.5 查询字符串:当我们要想服务器发送数据请求的时候,我们可以把数据加在问号后⾯以⼀定的格式 发送到后台,例如:http://nodeing.com/cloud/search?q=html, 其中q = html 表示发送到后台的数 据,这个我们会在表单发送数据的时候详细的操作实践
http模块是什么 或者说模块是什么
通常⼀台电脑作为服务器,需要安装相应的服务器软件来提供服务,例如,常⽤的服务器软件有 Aphche、Nginx、IIS,他们会响应前端的请求,根据不同的请求做不同的事情,⽽在node中你不需要 单独去安装这些服务器软件,可以直接使⽤内置的http模块来实现简单的服务器,所以简单的说,http 模块就是node内置的提供http服务的模块
创建⼀个http服务器
//引⼊http模块
var http = require('http');
//创建⼀个服务实例
var app = http.createServer(function (req, res) {
res.write("hello world");
res.end(); });
// 设置监听端⼝ app.listen(3000);
app.listen(3000);
接下来,在浏览器中输⼊ http://localhost:3000 查看效果
让我们来看看localhost是什么
当⽤户在浏览器输⼊⽹址的时候,⾸先会去查找本地的hosts⽂件,在这个⽂件中去看看有没有域名 和ip地址的映射(对应关系)关系,如果有就直接访问这个ip地址对应的电脑,如果没有接着往下找 注意: window系统的本地hosts⽂件位置在 C:\Windows\System32\drivers\etc⽬录下 , mac系统本地 hosts⽂件在 /etc目录下
下面是一个简单的数据发送的过程(有详细的注释)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--
method:表单发送数据的方式
action:表单把数据发送到哪里去了
注意:如果想把数据发到后台,必须给表单添加name属性
-->
<body>
<form action="/user_login" method="POST" id="form">
⽤户名: <input type="text" name="username" />
密码: <input type="text" name="password" />
<input type="submit" value="登录" id="btn">
</form>
</body>
</html>
// 综合实例:登录验证
//1.创建一个服务器
//2.路由知识:根据不同的请求返回不同的数据
//3.如何返回一个html页面,(登录的展示界面)
//4.url 模块 querystring模块
//5.数据发送的方式 POST 和 GET 用req.method从后台获取
//6.get 发送的数据放在的是url里面的查询字符串 post发送的数据在headers里面form data里面
//7.get 通常用来做数据查询 页面展示 post就涉及了数据库的修改
//8.表单一定要有name属性 后台才能接收数据
//9.req.method 可以获取到前台的发送方式
var url = require('url');
var fs = require('fs');
var querystring = require('querystring');
var http = require('http');
//上面引用了4个模块
var app = http.createServer(function (req, res) {
//设置返回内容的格式和编码
res.setHeader('content-type', 'text/html;charset=utf-8');
//把url字符串解析成对象
//url.parse的作用是可以将一个完整的URL地址,分为很多部分,常用的有:host、port、pathname、path、query。
var url_obj = url.parse(req.url);
if (url_obj.pathname === '/login') {
//返回一个网页
fs.readFile('./login.html', 'utf-8', function (err, data) {
//如果err为空 也就是没有错
if (!err) {
res.write(data);
res.end();
}
})
}
if (url_obj.pathname === '/user_login' && req.method === 'GET') {
//验证用户名是否正确,例如正确的账号admin 正确的密码123
//接收前台发送来的数据 url_obj.jquery:username=123&password=123
var query_data = querystring.parse(url_obj.query);
if (query_data.username === 'admin' && query_data.password === '123') {
res.write('登陆成功');
// res.end();
res.write('登录方式为POST');
res.end();
} else {
res.write('用户名或密码错误,请重新输入 <a href = "./login">重新登录</a>');
res.end();
}
}
if (url_obj.pathname === '/user_login' && req.method === 'POST') {
//要获取POST发送过来的数据,需要去监听两个事件
var post_data = '';
req.on('data', function (chunk) {
//chunk参数表示数据块,把数据切块分开传送
// console.log(chunk);
post_data += chunk;
// console.log(post_data);
})
req.on('end', function () { //数据完成触发的事件
// console.log('接收数据完成')
var post_obj = querystring.parse(post_data);
if (post_obj.username === 'admin' && post_obj.password === '123') {
res.write('登陆成功');
res.write('登录方式为POST');
res.end();
} else {
res.write('用户名或密码错误,请重新输入 <a href = "./login">重新登录</a>');
res.end();
}
})
// res.end();
}
});
app.listen(3000);