HTTP 入门

145 阅读5分钟

Hyper Text Transfer Protocol

  • WWW = URL + HTTP + HTML

IP (Internet Protocal)

IP主要约定了两件事

  • 如何定位一台设备
  • 如何封装数据报文,以跟其他设备交流(具体内容不关心)

如何获取外网IP

  • 租用宽带
  • 买一个路由器,用电脑和手机分别连接路由器
  • 路由器连上电信的服务器,路由器就会有一个外网IP,比如14.17.32.211,这是你在互联网中的地址
  • 如果重启路由器,有可能被重新分配外网IP
  • 手机和电脑的IP是内网IP

路由器的功能

  • 路由器有两个IP,一个外网IP和一个内网IP
  • 内网中的设备可以互相访问,但是不能直接访问外网
  • 内网设备想要访问外网,就必须经过路由器中转
  • 外网中的设备可以互相访问,但是无法访问你的内网
  • 外网设备想要把内容送到内网,也必须通过路由器
  • 路由器有时候也叫网关

几个特殊IP

  • 127.0.0.1 表示自己
  • localhost 通过 hosts 指定为自己
  • 0.0.0.0 不表示任何设备

端口

一个比喻

  • 麦当劳提供两个窗口,一号快餐,二号咖啡
  • 你去快餐窗口点咖啡会被拒绝,让你去另一个窗口
  • 你去咖啡窗口点快餐结果一样

一台机器可以提供不同服务

  • 要提供 HTTP 服务最好使用 80 端口
  • 要提供 HTTPS 服务最好使用 443 端口
  • 要提供 FTP 服务最好使用 21 端口
  • 一共有 65535 个端口

使用规则

  • 0 到 1023(2的10次方减1)号端口是留给系统使用的
  • 你只有拥有了管理员权限后,才能使用这 1024 个端口
  • 其他端口可以给普通用户使用
  • 比如 http-server 默认使用 8080 端口
  • 一个端口如果被占用,只能换一个窗口

域名是什么

域名就是对 IP 的别称

  • baidu.com 对应什么IP
    • ping baidu.com
  • qq.com 对应什么IP
    • ping qq.com
  • 知识点
    • 一个域名可以对应不同IP
    • 这个叫做均衡负载,防止一台机器扛不住
    • 一个IP可以对应不同域名,共享主机

域名和IP是怎么对应起来的

DNS(域名系统/域名服务)

  • 过程(当你输入baidu.com)
    • 浏览器会像电信/联通提供的DNS服务器询问该网站对应的IP
    • 电信/联通会回答一个IP
    • 浏览器会向对应IP的80/443端口发送请求
    • 请求内容是查看该网站的首页
  • 为什么是 80 或 443 端口
    • 服务器默认用 80 提供 http 服务
    • 服务器默认用 443 提供 https 服务
    • 开发者工具里可以看到具体的端口

额外

  • WWW
  • 关系
    • com 是顶级域名
    • baidu.com 是二级域名(俗称一级域名)
    • www.baidu.com 是三级域名(俗称二级)
    • 他们是父子关系
    • github.io 把子域名 xxx.github.io 免费使用

URL

image.png

  • HTTPS 默认端口 443, URL 不展示

curl 命令

用 curl 可以发 HTTP 请求

  • curl -v http://baidu.com
  • curl -s -v -- https://www.baidu.com

理解以下概念

  • url 会被 curl 工具重写,先请求 DNS 获得 IP
  • 先进行 TCP 连接,TCP连接成功后,开始发送 HTTP 请求
  • 请求内容看一眼
  • 响应内容看一眼
  • 响应结束后,关闭 TCP 连接
  • 真正结束

HTTP

  • 规定请求的格式是什么,响应的格式是什么

HTTP 请求与响应

前置条件

  • 安装 Node.js 8+
  • 理解 IP 和端口
  • 理解 URL 路径和查询参数

如何发请求

  • 方法
    • 用 Chrome 地址栏
    • 用 curl 命令
  • 概念
    • 帮你发请求的工具叫做用户代理
    • 英文名 User Agent

如何做出一个响应

  • 需要编程
    • Node.js 有一个 http 模块可以做到
  • 注意事项
    • 这些代码就是服务器代码,一般放在服务器上
    • path 是不带查询参数的路径 /x
    • query 是查询参数的对象形式 {a:'1'}
    • queryString 是查询参数的字符串形式 ?a=1
    • pathWithQuery 是带查询参数的路径,一般不用
    • request 是请求对象
    • response 是响应对象

代码逻辑

  • 语法
    • `这种字符串` 里面可以回车
    • '这种字符串' 里面要回车只能用 \n 表示
  • 逻辑
    • 每次收到请求都会把中间的代码执行一遍
    • 用 if else 判断路径,并返回响应
    • 如果是已知路径,一律返回 200
    • 如果是未知路径,一律返回 404
    • Content-Type 表示内容的 类型/语法
    • response.write() 可以填写返回的内容
    • response.end() 表示响应可以发给用户了

HTTP 基础概念

请求

  • 请求动词 路径加查询参数 协议名/版本
  • Host:域名或IP
  • Accept: text/html
  • Content-Type: 请求体的格式
  • 回车
  • 请求体(也就是上传内容)

细节

  • 三部分:请求行、请求头、请求体
  • 请求动词有 GET/POST/PUT/PATCH/DELETE 等
  • 请求体在 GET 请求中一般为空
  • 文档位于 RFC 2612 第五章
  • 大小写不敏感(随意)

响应

  • 协议名/版本 状态码 状态字符串
  • Content-Type:响应体的格式
  • 回车
  • 响应体(也就是下载内容)

细节

  • 三部分:状态行、响应头、响应体
  • 常见的状态码是考点
  • 文档位于 RFC 2612 第六章

用 curl 构造请求

  • curl -v http://127.0.0.1:8888
  • 设置请求动词
    • -X POST
    • 注意大小写
  • 设置路径和查询参数
    • 直接在 url 后面加
  • 设置请求头
    • -H 'Name:Value' 或者 --header 'Name:Vlue'
  • 设置请求体
    • -d '内容' 或者 --data '内容'

用 Node.js 读取请求

  • 读取请求动词
    • request.method
  • 读取路径
    • request.url 路径,带查询参数
    • path 纯路径,不带查询参数
    • query 只有查询参数
  • 读取请求头
    • request.headers['Accept']
  • 读取请求体

用 Node.js 设置响应

  • 设置响应状态码
    • response.statusCode = 200
  • 设置响应头
    • response.setHeader('Content-Type','text/html')
  • 设置响应体
    • response.write('内容')
    • 可追加内容