http协议是客户端和服务器端请求和响应的标准。
我们从客户端向服务器端发送请求,然后服务器端接收到请求后,向我们发送响应。
什么是报文?
在http协议中有一个报文的概念,也就是在http请求和响应的过程中传递的数据块就叫报文,包括了传送的数据和一些附加信息。
报文又分为请求报文和响应报文:
请求报文就是客户端向服务器端发送请求时所携带的数据块;
响应报文就是服务器端向客户端进行响应时所携带的数据块。
Headers里存放的就是请求和报文的数据,Response 就是响应报文,Request就是请求报文
Response里显示的是服务器端响应给客户端的具体内容
请求报文:
请求方式有两种:
- GET 请求数据
- POST发送数据
一般获取数据请求数据用GET,添加数据请求用POST,如果既不是获取也不是添加数据,只是一般数据,我们用POST,因为POST相较于GET要安全些。
通过地址栏输入网址的方式发送的是GET请求,操作代码示例:
// 引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 用request添加服务器请求事件
app.on('request',(req,res) => {
// 获取客户端的请求方式,要用到req参数,因为req就是请求对象,其中就包含了请求方式
// req.method可以获取到请求方式
console.log(req.method);
// 只要有请求过来,就会有响应 用res.end
res.end('<h2>Hello Http User</h2>');
})
// 监听一个3000的端口
app.listen(3000);
console.log('网站服务器启动成功');
先在浏览器地址栏中输入:locahost:3000,然后在命令行工具中执行node n.js文件,结果如下:
说明通过地址栏输入网址的方式是GET请求,有两个GET,是因为第二个GET是浏览器自动请求的。
如何发送post请求方式呢?
用html页面写一个表单form,在浏览器窗户打开后,点击提交按钮,然后再打开命令行窗口,会发现输出的是POST请求:
<body>
<!-- form中有一个属性是method,指当前表单提交的方式,可以是GET或POST,默认是GET -->
<!-- action是表单要提交到哪个地方,也就是指定表单提交的地址 -->
<form action="http://localhost:3000" method="POST">
<input type="submit" value="提交"></form>
</body>
命令行工具执行如下:
如何根据客户端的响应地址来响应不同的内容?
以上操作不管在地址栏中localhost:3000后输入什么,都会返回GET请求,但我们想根据用户输入地址栏信息的不同,来响应不同的结果,比如localhost:3000/index,就响应首页,localhost:3000/list,就响应列表页。
需要用到请求地址:req.url 获取请求地址
操作代码示例:
// 先引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 为服务器添加请求事件,也就是request事件
app.on('request',(req,res) => {
// 获取请求地址 req.url
console.log(req.url);
})
// 监听3000端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下,在浏览器地址栏中输入/index后,打开命令行工具,执行的结果就是/index,如果输入的是/list,那么命令行工具执行的结果就是/list。
接下来我们就可以根据客户端的响应地址来响应不同的内容了,如下:
操作代码:
// 先引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 为服务器添加请求事件,也就是request事件
app.on('request',(req,res) => {
// 获取请求地址 req.url
if(req.url == '/index' || req.url == '/'){
res.end('Welcome to Homepage');
}else if(req.url == '/list'){
res.end('Welcome to Listpage');
}else {
res.end('Not Found Page');
}
})
// 监听3000端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
响应报文:
对于客户端的每次请求,服务器端都要进行响应,在响应时要告诉客户端,当前的这次请求是成功还是失败,如何知道呢,就是通过HTTP状态码知道的。
1.HTTP状态码:
- 200 表示请求成功
- 404 表示请求的资源没有被找到
- 500 表示服务器端错误
- 400 表示客户端请求有语法错误
操作代码如下:
// 先引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 为服务器添加请求事件,也就是request事件
// 参数res就是响应对象
app.on('request',(req,res) => {
// 参数res对象下有一个方法:writeHead()
// 该方法的第一个参数是状态码,默认是200,现在设置成500
res.writeHead(500);
})
// 监听3000端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
如果给的参数是200,执行结果就显示200,并取消标红
2.内容类型
要告诉客户端当前返回的内容类型是什么
- 如果返回的是html文件:text/html
- 如果返回的是css文件:text/css
- 如果返回的是javascript文件:application/javascript
- 如果返回的是纯文本文件:text/plain
- image/jpeg
- application/json
那么如何去设置内容类型呢?
操作代码示例:
// 先引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 为服务器添加请求事件,也就是request事件
// 参数res就是响应对象
app.on('request',(req,res) => {
// 参数res对象下有一个方法:writeHead()
// 该方法的第一个参数是状态码,默认是200
// 第二个参数是一个对象,是响应报文信息
res.writeHead(200,{
// 指定类型是纯文本,那么就会输出<h1>Welcome to Homepage</h1>,而不是把h1当作标签执行
'content-type': 'text/plain'
});
// 获取请求地址 req.url
if(req.url == '/index' || req.url == '/'){
res.end('<h1>Welcome to Homepage</h1>');
}else if(req.url == '/list'){
res.end('Welcome to Listpage');
}else {
res.end('Not Found Page');
}
})
// 监听3000端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下:
// 先引入系统模块http
const http = require('http');
// 创建web服务器
const app = http.createServer();
// 为服务器添加请求事件,也就是request事件
// 参数res就是响应对象
app.on('request',(req,res) => {
// 参数res对象下有一个方法:writeHead()
// 该方法的第一个参数是状态码,默认是200
// 第二个参数是一个对象,是响应报文信息
res.writeHead(200,{
// 指定类型是html文件,那么就会输出标题版的Welcome to Homepage
// charset=utf8 把编码指定为utf8类型,这样输入汉字就不会是一堆乱码
'content-type': 'text/html;charset=utf8'
});
// 获取请求地址 req.url
if(req.url == '/index' || req.url == '/'){
res.end('<h1>Welcome to Homepage欢迎来到首页</h1>');
}else if(req.url == '/list'){
res.end('Welcome to Listpage');
}else {
res.end('Not Found Page');
}
})
// 监听3000端口
app.listen(3000);
console.log('网站服务器启动成功');
执行结果如下: