HTTP核心模块
@ 姜波 | 星期日,六月 28 日,2020 年 | 3 分钟阅读 | 更新于 星期日,六月 28 日,2020 年

http超文本传输协议

  • 协议至少双方 -> http双方!!
    • 客户端(浏览器) -> 服务器 BS
    • 原生应用(QQ) -> 服务器 CS
  • 就是数据如何传输

  • 特点:

    • 一问一答(先有请求,后有响应)
    • 5大特点:
      • 轻便/ 简单快速 支持客户/服务器模式
      • 无连接(不为每一个请求保持住链接)
      • 无状态( 服务器不记得客户端是谁 ) -> cookie

主体对象

  • 服务器对象 http.createServer();
  • 客户端对象http.request({host:'www.baidu.com'});
  • 请求报文对象(对于服务器来说,是可读) req
  • 响应报文对象(对于服务器来说,是可写) res

状态码分类

  • 1开头,正在进行中
  • 2开头,完成
  • 3开头 ,重定向
  • 4开头 , 客户端异常
  • 5开头, 服务器异常

创建服务器步骤

  1. 引入http核心对象
  2. 利用http核心对象的.createServer(callback); 创建服务器对象
  3. 使用服务器对象.listen(端口,ip地址) 开启服务器
  4. callback(req,res) 根据请求处理响应

请求报文对象(只读)

  • 请求首行中的url req.url
  • 请求首行中的请求方式 req.method
  • 请求头中的数据req.headers 是一个对象
  • 头信息中,也可以作为与服务器交互的一种途径

获取请求体数据

  • 代码对比

  • 浏览器: $('#xx').on(‘submit’,function(e){ })

  • 服务器: req.on(‘data’,function(d){ d.toString(); })

响应对象

  • 响应首行 res.writeHead(状态码)
  • 写响应头
    • 一次性写回头信息
      • res.writeHead(200,headers)
    • 多次设置头信息
      • res.setHeader(key,value);
  • 写响应体
    • 一次性写回响应体
      • res.end();
    • 多次写回响应体
      • res.write();

请求与响应

  • 头行体
  • content-type是对请求或者响应体数据,做出的说明

响应体数据

  • res.write(‘字符串’||读出文件的二进制数据)
  • res.end(‘字符串’||读出文件的二进制数)

http总结梳理

  • http故事剧情中的主角 : 服务器(女)(响应报文) 客户端(男)(请求报文)
    • 因为都是男人主动找女人
    • 服务器:http.createServer创建服务器,监听端口listen,处理响应on(‘request’,(req,res)=> { })
    • 请求报文: 由于我们是服务端代码,所以该报文是浏览器发的,我们看就行了
      • 头行体(异步)
    • 响应报文:由于我们是服务端代码,所以响应报文,我们写就行了
      • 头行体
        1. 头设置1次,和多次
        2. 体写1次和多次

querystring核心对象

  • querystring.parse(formStr)
  • username=jack&password=123转换成如下
  • { username: ‘jack’, password: ‘123’ }

跨域问题

  • 传统开发方式:前端代码及请求数据接口都在同一个服务器上,前端代码测试依赖服务器
  • 前后端分离:
    • 静态服务器: 运行前端代码
    • 后台服务器: 运行数据接口服务器
    • 互不影响,浏览器向其他服务器发送ajax请求,会产生跨域

jsonp

  • 知识点补充

  • url核心对象

    const url = require('url');
    url.parse('http://xxx.com?id=1',true); // 第二个参数是将id=1转换成对象
    // output:  { protocal:'http',..省略..query:{id:1}   }

CORS

  Access-Control-Allow-Origin: 'http://xxx.com'  //允许哪个域在跨域的时候访问,*代表所有
  // 告诉浏览器,跨域时允许有cookie,同时客户端也要设置withCredentials:true + Origin不能是*
  Access-Control-Allow-Credentials: true  
  Access-Control-Allow-Methods: 'GET,POST,PUT,DELETE';   // 默认允许get/post
  Access-Control-Allow-Headers:'xxx';   // 允许你自己加的头来通信
  • 浏览器在非简单请求(get/post)||包含自定义头||content-type非键值对的时候,会先请示服务器,来一个OPTIONS请求,如果不满足,拒绝发送ajax请求

代理

  • 下载依赖包便于请求操作 npm i request -S

配置https

  • 公钥 公开的加密方式
  • 私钥 存在服务器的唯一解公钥加密的方式
  • 签名 确保数据的一致性
  • 证书 确保当前发送数据单位可信
node
保存为图片

公众号

Image text

QQ

Image text

微信

Image text

微信打赏

Image text

社交链接