• 珠峰-6-http和http-server原理


    ???? websock改天研究下然后用node去搞。 websock的实现原理。

    ##### 第9天的笔记内容。

    ## Header 规范
    
    ## Http 状态码
    - 101 webscoket 双向通信
    - 200 成功 204 没有响应体 206 断点续传
    - 301(永久重定向) 302(临时重向) 304(缓存)只能服务端设置
    - 401 (没有权限) 403 (登录了没权限) 404  405(请求方法不存在、不支持)
    - 502 负载均衡 
    
    
    ## 请求方法 RestfulApi
    根据不同的动作 做对应的处理
    - get 获取资源 
    - post 新增资源 
    - put 上传文件  修改
    - delete  删除资源
    - options 跨域出现 (复杂请求时出现) 只是get / post 都是简单请求 + 自定义的header
    
    ## 传输数据
    - 请求行 url(请求的方法,url,协议)
    - 请求头 自定header
    - 请求体 提交的数据
    
    - 响应行 状态码(协议,状态,简语)
    - 响应头 可以自定义
    - 响应体 返还给浏览器的结果
    
    ## websocket 第一次通信是通过http + tcp

    ##### 第9天自己的总结

    ##### 模仿http测试接口, (1)命令行    (2) postman   (3)自己一个html    (4)自己 写一个node client.js

    #####  自己写一个服务器。

    // 通过node实现一个http服务
    // 都是通过核心模块来提供  http模块
    const http = require('http');
    
    // 服务器要有特定的ip 和端口号
    let server = http.createServer();
    let querystring = require('querystring');
    let url = require('url'); // url.parse
    
    // 如果别人请求我,我需要去解析请求
    server.on('request',(req,res)=>{
        // req 代表的是客户端
        // res 代表的就是服务端
        
        // 1) 请求行
        console.log(req.method); // 方法名大写
        let {pathname,query} = url.parse(req.url,true)
        console.log(pathname,query); // 请求路径  / 表示首页  url是不包含# hash的
        console.log(req.httpVersion);
        // 2) 请求头
        console.log(req.headers); // 取header都是小写
        // 3) 获取请求体
        let arr = []
        req.on('data',function(chunk){
            arr.push(chunk);
            console.log(chunk.toString()); // 流的原理 push(null) data方法不一定会触发
        });
        req.on('end',function(){
            console.log('end'); // end是一定触发
            console.log()
    
            // 响应行 头 体
            res.statusCode = 200; // 响应状态码
            // res.setHeader('Content-Length','1');
            res.setHeader('Content-Type','text/plain;charset=utf-8');
            let content = Buffer.concat(arr).toString();
            let type = req.headers['content-type']
            if(type === 'application/json'){
                let obj = JSON.parse(content)
                return res.end(obj.a+'');
            }else if(type === 'application/x-www-form-urlencoded'){
                // 第二个参数 字段间的分隔符 第三个参数 是key value分隔符
                let obj = querystring.parse(content);
                return res.end(obj.a+'');
                //  let str = 'a=1; b=2'
                //  str.replace(/([^=&])=([^&=])/g,function(){
                //      console.log(arguments[1],arguments[2])
                //  })
            }else{ //  如果不支持的就默认返回
                return res.end(content);
            }
           
        });
        
    })
    
    // 开启一个端口号
    let port = 3001;
    server.listen(port,()=>{
        console.log(`server start ${port}`)
    });
    
    // 如果端口被占用了 自动+1
    server.on('error',(err)=>{
        if(err.errno === 'EADDRINUSE'){
            server.listen(++port)
        }
    })
    
    // 每次服务端代码发生变化 都需要重启服务
    // nodemon node的监视器 监视文件变化的
    // sudo npm install nodemon -g   nodemon 文件名  (可以增加配置文件)
    // pm2
    
    
    
    
    
    // 一个完整的url
    // const requestUrl = `http://username:password@www.baidu.com:80/s?offset=1&limit=30#app`
    
    // let result = url.parse(requestUrl,true);
    // console.log(result)
    /*
    {
        protocol: 'http:',
        slashes: true,  是否有/
        auth: 'username:password', 用户信息
        host: 'www.baidu.com:80',
        port: '80',
        hostname: 'www.baidu.com', // 主机名
        hash: '#app',
        query: 'offset=1&limit=30',  查询参数
        pathname: '/s',  请求路径 资源路由
        path: '/s?offset=1&limit=30',
        href:
         'http://username:password@www.baidu.com:80/s?offset=1&limit=30#app' }
    
    */

     

    ##### form表单可以跨域。 

    ##### json用双引号

    #####

    保证this正确的三种方案。 

     

     

    ####__defineSetter__是defineProperty  的部分功能。

     ##### 作用域的问题,有了作用域重名的机会就少了

    #### 说是@babel-polyfill已经可以被替代了,这个表示怀疑。

     #### 有时间观察下这个字段。

    Connection:
    keep-alive

     #### keep的头部

    ##### 状态码,返回状态。

    ##### options请求。

    https://www.cnblogs.com/ermaoblog/p/8855915.html

    出现的条件1: 跨域的时候才会出现

    出现的条件2: 复杂请求。比如delete,put   和如果请求的是json,post也属于复杂请求.

    #### form不会有跨域问题。

    form允许跨域。一般提交到不同的域名之后,就跳走了,不跳走,当前页面的js页获取不到返回的信息。

    https://blog.csdn.net/M_allstar/article/details/99663049

    ##### http-server原理。

     #### 对这句话存疑

    ##### 静态资源放在打包前打包后都能找到的公共地方。

      #### 强制缓存10秒会发起请求么。

    强制缓存的文件会发起请求,但是结果返回的是200,

    对比返回返回的是304.

    #### 一般出现这个问题,代表浏览器没有发送成功。但是谷歌有时候,也是发送成功了。

    #### 代理正向代理,反向代理。

    Nginx,webpack都是反向代理。

    跳板机正向代理。

    反向代理一般对用户透明的,用户感觉不到,做一些负载均衡,服务端的保护墙。

    而正向代理是客服端的保护墙。

  • 相关阅读:
    软工实践
    福大软工 · 最终作业
    福大软工 · 第十二次作业
    Beta冲刺(7/7)
    Beta冲刺(5/7)
    Beta 冲刺(6/7)
    Beta冲刺 (4/7)
    Beta冲刺 (3/7)
    Beta冲刺 (2/7)
    Beta 冲刺(1/7)
  • 原文地址:https://www.cnblogs.com/coding4/p/11613267.html
Copyright © 2020-2023  润新知