Nond.Js基础(2)——请求响应与HTTP协议

目录


一、请求响应与HTTP协议

1、创建web服务器 

2、请求与响应

1、req

2、res

3、根据不同url地址处理请求:

3、HTTP协议

请求报文:

get类型接口:

post类型接口:

 响应报文:


一、请求响应与HTTP协议

1、创建web服务器 
//引入模块
const http = require('http');
//http.createServer()搭建web服务器
let app=http.createServer((req, res) => {
//req请求;全称(request)
//res响应;全称(resposne)
    console.log(req.connection.remoteAddress);
    res.write('响应还未结束')
   
    res.end('ok')
})
//启动服务器
//监视3000端口
app.listen(3000,() => {
    console.log('server run port 3000')  
})
//在终端输入node 文件名.js
//启动成功后,可以在浏览器访问127.0.0.1:3000

我们用http.createServer()创建一个http服务


2、请求与响应

((req, res) => {}这是匿名函数,这个函数充当回调函数,当有http请求时,这个函数会自动被调用。这里两个参数。第一个参数表示来自客户端浏览器的请求,第二个参数用来设置对本次请求的响应。函数的形参名并不重要,但是一般使用req(resposne)和res(request)表示。

当某个客户端来请求这个服务器时,这个函数会自动调用,同时会自动给这两个参数赋值。第一个参数中包括本次请求的信息。


1、req

req : 请求

req.url :本次请求的地址

req.method :获取请求行中的请求方法

req.headers :获取请求头


2、res

第二个参数用来设置本服务器对这次请求的处理。这个参数一般命名是res,它是一个对象,其中有很多方法和属性。

res.end() :把本次的处理结果返回给客户端浏览器,如果没有,客户端浏览器就收不到响应。
res.setHeader() :设置响应头,比如设置响应体的编码

比如这种乱码问题,res.setHeader() 设置响应头可以解决。

const http = require('http');
const path = require('path');
const fs = require('fs');

let app = http.createServer((req, res) => {
    let { url, method, headers } = req;
    url = url.toLowerCase();
    console.log(url);
    if (url === "/") {

        //响应头
        res.setHeader('Content-Type', 'text/html;charset=utf-8');

        res.end('访问个毛线')
    }
    else {
        let html404 = fs.readFileSync(path.join(__dirname, './public/index404.html'));
        res.statusCode = 404;
        res.end(html404);
    }
});
app.listen(3000, () => {
    console.log('Server run port 3000');
});

 

3、根据不同url地址处理请求:

例:

const http = require('http');
const path = require('path');
const fs = require('fs');

let app = http.createServer((req, res) => {
    let { url, method, headers } = req;
    console.log(headers);
    url = url.toLowerCase();
    console.log(url);
//请求地址"/"或"index.html"
    if (url === "/" || url === "/index.html") {
        let html = fs.readFileSync(path.join(__dirname, './public/index.html'));
        res.end(html);
    }
//请求地址"test"
    else if (url === "/test") {
        //响应头
        res.setHeader('Content-Type', 'text/html;charset=utf-8');
        res.end('访问个毛线')
    }
    else {
        let html404 = fs.readFileSync(path.join(__dirname, './public/index404.html'));
        res.statusCode = 404;
        res.end(html404);
    }
});
app.listen(3000, () => {
    console.log('Server run port 3000');
});

 

3、HTTP协议

HTTP(全称:HyperText Transfer Protocol)超文本传输协议规定了如何从网站服务器传输超文本到本地浏览器,基于客户端服务器架构工作,是客户端和服务器端请求和应答的标准。


 

请求报文:

请求方式:(get请求数据、post发送数据 、...)(可以下载postman,API调试工具,更方便)


 

get类型接口:

参数被放置在浏览器地址栏中, 例如:

http://localhost:3000/?name=zhangsan&age=20

参数获取需要借助系统模块url,url模块用来处理url地址

例:

const http = require('http');
const path = require('path');
const URL = require('url');
const qs = require('querystring')
let app = http.createServer((req, res) => {
    let { url, method } = req;
    let { pathname,query} = URL.parse(url);
    if (pathname === '/news' && method === 'GET') {
        let {id}=qs.parse(query)
        let news = {
            list:[
                { id: 1, msg: '11111111111111111111111111' },
                { id: 2, msg: '22222222222222222222222222' },
                { id: 3, msg: '33333333333333333333333333' }
            ]
        }
        for(let i=0; i<news.list.length; i++){
            if(news.list[i].id == id){
                res.end(JSON.stringify(news.list[i]));
                return;
            }
        }
        res.end(JSON.stringify({err:true,msg:'id不存在'}));
    }
    else {
        res.statusCode = 404;
        res.end('Not Found');
    }
})
app.listen(3000, () => {
    console.log('Server run port 3000');
})


post类型接口:

在发post请求时,传递的数据会在请求体中,也是字符串格式,并且是一点一点上传到web
服务器的,每上传一部分就会触发data事件,而最后全部上传完成之后,会触发end事件。

使用querystring将参数转换为对象格式(解析参数)

const http = require('http');
const path = require('path');
const URL = require('url');
const qs = require('querystring')
let app = http.createServer((req, res) => {
    let { url, method } = req;
    let { pathname, query } = URL.parse(url);
    if (pathname === '/news' && method === 'POST') {
        let data = '';
        req.on('data', (chunk) => {
            data += chunk;
        })
        req.on('end', () => {
            let { id } = qs.parse(data);
            let news = {
                list: [
                    { id: 1, msg: '11111111111111111111111111' },
                    { id: 2, msg: '22222222222222222222222222' },
                    { id: 3, msg: '33333333333333333333333333' }
                ]
            }
            for (let i = 0; i < news.list.length; i++) {
                if (news.list[i].id == id) {
                    res.end(JSON.stringify(news.list[i]));
                    return;
                }
            }
            res.end(JSON.stringify({ err: true, msg: 'id不存在' }));

        })
    }
    else {
        res.statusCode = 404;
        res.end('Not Found');
    }
})
app.listen(3000, () => {
    console.log('Server run port 3000');
})


 响应报文:

(HTTP状态码)

  • 200 请求成功
  • 404 请求资源没找到
  • 403 禁止请求
  • 500 服务器端错误
  • 400 客户端错误

例:

状态200,请求成功


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值