3.node-http协议

163 阅读5分钟

一. 概念
二. 请求报文的组成
三.HTTP请求行
四.HTTP请求头
五.HTTP的请求体
六.响应报文的组成
七.创建HTTP服务
八.获取HTTP请求报文
九.HTTP设置响应
十.GET和POST请求的区别

一. 概念

  1. HTTP协议. 中文叫超文本传输协议; 是一种基于TCP/IP的应用层通信协议; 这个协议详细规定了浏览器和万维网服务器之间互相通信的规则

  2. 协议中主要规定了两个方面的内容

    • 客户端: 用来向服务器发送数据, 可以被称为请求报文
    • 服务端: 向客户端发送数据, 可以被称为响应报文

二. 请求报文的组成

  • 请求行
  • 请求头
  • 空行
  • 请求体

三.HTTP请求行

  • 请求方法: get post put delete等

  • 请求URL(统一资源定位器)

    http://www.baidu.com:80/index.html?a=100#logo

    • http: ------- 协议(https ftp ssh等)
    • www.baidu.com ------- 域名
    • 80 ------- 端口号
    • /index.html ------- 路径
    • a=100 ------- 查询字符串
    • #logo ------- 哈希(锚点链接)

四.HTTP请求头

格式: 头名:头值

请求头请求值
Host主机名
Connection连接的设置keep-alive(保持连接);close(关闭连接)
Cache-Control缓存控制max-age=0(没有缓存)
Upgrade-Insecure-Requests将网页中的http请求转化为https请求
User-Agent用户代理,客户端字符串标识, 服务器可以通过这个标识来识别这个请求来自哪个客户端, 一般在PC端和手机端的区分
Accept设置浏览器接收的数据类型
Accept-Encoding设置接收的压缩方式
Accept-Language设置接收的语音q=0.7为喜好系数,满分为1
Cookie浏览器的缓存

五.HTTP的请求体

请求体类型

  • 字符串
  • JSON

六.响应报文的组成

  1. 响应行

    HTTP/1.1 200 OK
    

    响应状态码和响应字符串关系是一一对应的

  2. 响应头

    • Cache-Control:缓存控制private私有的, 只允许客户端缓存数据
    • Connection: 链接设置
    • Content-type: text/html;charset=utf-8 设置响应体的数据类型以及字符集, 响应体为html, 字符集utf-8
    • Content-Length: 响应体的长度,单位为字节
  3. 空行

  4. 响应体

    响应体内容常见的类型有HTML、CSS、JS、图片、JSON

七.创建HTTP服务

  1. 导入HTTP模块
  2. 创建服务对象 create创建server服务
  3. 监听端口, 启动服务, 默认端口为803佳美娜1
// 1. 导入HTTP模块
const http = require('http')
​
//2. 创建服务对象 create创建server服务
/**
 * 2.1. request为请求, 是对请求报文的封装, 通过request对象可以获得请求报文的数据
 * 2.2. response为响应, 是对响应报文的封装对象, 通过response对象可以设置响应报文
 * 2.3 http.createServer里回调函数的执行时期: 当接受到HTTP请求时就会执行
 */
const server = http.createServer((request,response) => {
  // 解决中文乱码
  response.setHeader('content-type','text/html;charset=utf-8')
  response.end("你好!")
})
​
//3. 监听端口, 启动服务, 默认端口为80
server.listen(9000,()=>{
  console.log('服务已启动, 链接为http://127.0.0.1:9000')
})
​
​

八.获取HTTP请求报文

获取请求的数据,需要通过request对象

  • 获取请求方法
  • 获取请求版本
  • 获取请求路径
  • 获取URL路径
  • 获取URL查询字符串
  • 获取请求头
  • 获取请求体
const server = http.createServer((request,response) => {
  /**
   * 获取HTTP请求报文
   * 1.获取请求方法
   * 2.获取请求版本
   * 3.获取请求路径
   * 4.获取URL路径
   * 5.获取URL查询字符串
   * 6.获取请求头
   * 7.获取请求体
   */
  console.log(request.method) //POST
  console.log(request.httpVersion)//1.1
  //3 只能获取路径以及查询字符串,无法获取URL中的域名以及协议的内容
  console.log(request.url)// /?name=zhangsan
  console.log(require('url').parse(request.url).pathname) // /
  //5.不加第二个参数true, 返回的为字符串, 加上后返回对象
  console.log(require('url').parse(request.url,true).query) // name=zhangsan
  console.log(request.headers)
  // {
  //   'user-agent': 'PostmanRuntime/7.28.4',
  //   accept: '*/*',
  //   'postman-token': '2837a024-bfa0-4ad7-ba76-93522f052301',
  //   host: '127.0.0.1:9000',
  //   'accept-encoding': 'gzip, deflate, br',
  //   connection: 'keep-alive',
  //   'content-type': 'application/x-www-form-urlencoded',
  //   'content-length': '10'
  // }
​
  //4.7 获取请求体
  let body = ""
  request.on('data', chunk => {
    body += chunk
  })
  request.on('end',()=>{
    console.log(body)// name2=lisi
    // 解决中文乱码
    response.setHeader('content-type','text/html;charset=utf-8')
    response.end(body)
  })
​
})
  • 获取请求路径和查询字符串第二种方法
  //实例化URL对象 new URL (input[, base])
  let urlObj = new URL (request.url, 'https://127.0.0.1')
  console.log(urlObj)
  console.log(urlObj.searchParams) // 获取网址查询参数的`URLSearchParams`对象,此属性是只读的 URLSearchParams { 'name' => '123' }
  console.log(urlObj.searchParams.get('name')) //123
  /**
   * URL {
      href: 'https://127.0.0.1/login?name=123',
      origin: 'https://127.0.0.1',
      protocol: 'https:',
      username: '',
      password: '',
      host: '127.0.0.1',
      hostname: '127.0.0.1',
      port: '',
      pathname: '/login',
      search: '?name=123',
      searchParams: URLSearchParams { 'name' => '123' },
      hash: ''
    }
   */

九.HTTP设置响应

//1.导入http模块
const http = require('http')
//2.创建服务对象
const server = http.createServer((request,response)=>{
  /**
   * 设置http响应报文
   * 1.设置响应状态码
   * 2.设置响应状态描述
   * 3.设置响应头
   * 4.设置响应体
   */
  //1.设置响应状态码
  response.statusCode = 201
  //2. 设置响应状态描述
  response.statusMessage = 'success'
  // 3.设置响应头
  response.setHeader('server','test')
  response.setHeader('test',['a','b','c']) //可以创建多个相同键的响应头
  //4.设置响应体
  response.write('123456')
  response.end('hello')
})
//3.监听端口启动服务
server.listen(8001,()=>{
  console.log('服务已经启动,链接为http://127.0.0.1:8001')
})

十.GET和POST请求的区别

GET和POST是HTTP协议请求的两种方式

  • GET主要用来获取数据, POST主要用来提交数据
  • GET带参请求, 是将参数缀到URL之后, 在地址栏中输入url访问网站就是GET请求; POST带参请求是将参数放到请求体中
  • POST请求相对GET更安全一点, 因为GET在浏览器中参数会暴露在地址栏
  • GET请求大小有限制, 一般为2K, 而POST请求则没有大小限制