4:HTTP响应与请求处理

一 请求参数

客户端向服务器端发送请求时,有时需要携带一些客户信息,客户信息需要通过请求参数的形式传递到服务器端,比如登录操作。

 

二 get请求参数

//1 参数被放置于浏览器地址栏中 例如:http://localhost:3000/?name=zhangsan&age=66 [ get参数 ]

//2 在node.js获取参数
const url = require('url');//引入处理url的内部模块
console.log(url.parse(req.url));

返回一个对象
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?name=zhangsan&age=66',
query: 'name=zhangsan&age=66',
pathname: '/index',
path: '/index?name=zhangsan&age=66',
href: '/index?name=zhangsan&age=66' }

 

三 POST请求参数

知识梳理

//1 请求参数被放置在请求体中进行传输

//2 获取POST参数需用使用 data事件 和 end事件

//3 使用queryString系统内置模块 的parse方法  将参数转换为对象格式

程序代码

const http = require('http');//1 用于创建网站服务器的 内置模块
const app = http.createServer();//2 app对象就是网站服务器对象
const queryString = require('querystring');
//3 当客户有请求来的时候
app.on('request',(req,res)=>{
    //设置字符集
    res.writeHead(200,{
        'content-type':'text/html;charset=utf8',//默认值
    });
    //创建变量接收参数 [因为post数据不是一次传输完成的]
    var postData = '';
   //监听参数参数事件 req.on(
'data', function(params){ postData += params; });
   //监听参数传输完毕事件 req.on(
'end',function () { console.log(queryString.parse(postData)); //返回对象形式的数据{ username: 'fdsfsed', password: 'dfdsf' } }); //响应内容 res.end('李白'); }); //4 监听3000端口 对外提供访问 app.listen(3000); console.log('网站服务器启动成功');

 HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>post请求参数</title>
</head>
<body>
<form action="http://localhost:3000" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="提交">
</form>
</body>
</html>在浏览器查看报文体

在浏览器查看post请求的数据格式

  

 

四 路由

http://localhost:3000/index
http://localhost:3000/login
路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么。

 

 

 代码

//1 引入系统模块HTTP
//2 创建网站服务器
//3 为网站服务器添加响应事件
//4 实现路由功能
//4.1 获取客户端的请求方式
//4.2 获取客户端的请求地址

var http = require('http');
var url  = require('url');

var app = http.createServer();

app.on('request',function (req,res) {
    //获取请求方法 并转为小写
    const method = req.method.toLowerCase();
    //获取请求地址
    const pathname = url.parse(req.url).pathname;

    res.writeHead(200,{
        'content-type':'text/html;charset=utf8',//默认值
    });

    //先判断请求方式 再判断请求地址
    if (method == 'get') {
        //判断get的请求地址
        if (pathname == '/' || pathname == '/index') {
            res.end('首页地址');
        } else if (pathname == '/list') {
            res.end('列表页')
        } else {
            res.end('请求地址不存在');
        }


    } else if (method == 'post') {
        //判断post的请求地址
    }
});

app.listen(3000);
console.log('服务启动成功');

 

 

五 静态资源

服务端不需要处理 直接返回的资源

css html 图片资源等

代码实现

var http = require('http');//http服务模块
var url  = require('url');//url解析模块
var path = require('path');//路径拼接模块
var fs   = require('fs');//读取文件模块
var mime = require('mime');//获取请求类型的 第三方模块
var app = http.createServer();
app.on('request', function (req,res) {

    //1 获取用户的请求路径
    var pathname = url.parse(req.url).pathname;
    pathname = pathname == '/' ? '/default.html' : pathname;
    //2 把用户的请求路径转换为真实的服务器磁盘路径
    let realPath = path.join(__dirname,'public' + pathname);
    //D:\nodecode\static\public\default.html
    //__dirname 当前文件的绝对路径

    var type = mime.getType(realPath);//获取到请求的资源类型
    // text/html
    // text/css
    // text/css
    // image/png
    // image/jpeg
    // image/png
    // image/jpeg
    // image/jpeg
    // image/png
    // image/png 获取到了所有的

    //3 读取文件
    fs.readFile(realPath, (error,result) => {
        if (error != null) {
            //设置状态码和字符集
            res.writeHead(404,{
               'content-type':'text/html;charset=utf8',
            });
            res.end('文件读取失败');
            return;
        } else {
            //指定放回资源的类型
            res.writeHead(200,{
                'content-type':type
            });
            res.end(result);
        }
        //如果文件读取成功 error就是空  result就是文件内容
        //如果文件读取失败 error是一个对象 里面存储失败信息 result为空
    });
});

app.listen(3000);
console.log('server start success');

 

六 动态资源

 

 

 

const http = require('http');//用于创建网站服务器的 内置模块
const url = require('url');//用于处理url的 内置模块

//app对象就是网站服务器对象
const app = http.createServer();

//node是基于事件驱动的语言 当什么来的时候 执行什么

//当客户有请求来的时候
app.on('request',(req,res)=>{
    //req  request的缩写  res request的缩写

    //1 获取请求方法 req.method
    //2 获取请求地址 req.url
    //3 获取全部请求报文 req.headers
    //  获取请求报文中的某一项 req.headers['键名']

    //4 设置响应报文
    res.writeHead(200,{
        'content-type':'text/html;charset=utf8',//默认值
    });
    //参数1  HTTP状态码
    //参数2  对象形式 设置 响应报文

    //console.log(req.url);

    //第一个参数:要解析的url地址
    //第二个参数:true 将查询参数解析成对象形式
    //console.log(url.parse(req.url,true));
    //query: { name: 'zhangsan', age: '66' }, query已经是一个对象形式
    let params = url.parse(req.url,true).query;
    console.log(params.name,params.age);




    if (req.url == "/index" || req.url == "/") {
        res.end('<h2>太原人民欢迎您</h2>');
    }

    if (req.method == "POST") {
        res.end('123');
    } else if (req.method == "GET") {
        res.end('456');
    }

    //res.end('你好');//响应 你好 给客户端

});


//监听3000端口 对外提供访问
app.listen(3000);
console.log('网站服务器启动成功');

//在命令行执行这个文件 浏览器才可以访问

 

 

posted @ 2021-03-16 20:47  棉花糖88  阅读(135)  评论(0编辑  收藏  举报