Node:HTTP协议,请求报文和响应报文,根据请求地址做出不同的响应

http协议是客户端和服务器端请求和响应的标准。

我们从客户端向服务器端发送请求,然后服务器端接收到请求后,向我们发送响应。

什么是报文?
在http协议中有一个报文的概念,也就是在http请求和响应的过程中传递的数据块就叫报文,包括了传送的数据和一些附加信息。

报文又分为请求报文和响应报文:
请求报文就是客户端向服务器端发送请求时所携带的数据块;
响应报文就是服务器端向客户端进行响应时所携带的数据块。

Headers里存放的就是请求和报文的数据,Response 就是响应报文,Request就是请求报文
在这里插入图片描述
Response里显示的是服务器端响应给客户端的具体内容

在这里插入图片描述
请求报文:
请求方式有两种:

  1. GET 请求数据
  2. 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('网站服务器启动成功');

执行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值