Http 及其跨域

Posted by 松一老贼 on August 22, 2020

http 请求

http 是一种无状态协议:不建立持久连接,不保留客户端信息,当一次请求完成后,连接就中断了

一次完整的 http 请求过程

  • 建立 tcp 连接
  • 浏览器向服务器发送请求命令
  • 浏览器发送头信息
  • 服务器应答
  • 服务器应答头信息
  • 服务器向浏览器发送数据
  • 关闭 tcp 连接

http 请求的四个组成部分

  1. 请求方式:get/post
  2. url
  3. 请求头:客户端环境信息、身份验证信息等
  4. 请求体:客户端提交的查询字符串、表单信息等

get/post 区别

  • get:用于获取信息,使用 url 传递参数,发送信息的大小有限制,幂等(查询一次和查询无数次得到的结果是相同的)
  • post:用于修改服务器资源,发送数据无限制

http 响应的三个部分

  1. 状态码:成功或失败
  2. 响应头
  3. 响应体

状态码

  • 1xx 信息类,表示接收到了浏览器请求,正在处理中
  • 2xx 表示成功
  • 3xx 表示重定向,请求没有成功,客户端必须采取进一步动作
  • 4xx 表示客户端错误
  • 5xx 表示服务端错误

跨域

一个域名的组成:

  • 协议(http://)
  • 子域名(www)
  • 主域名(xxx.com)
  • 端口号
  • 资源地址

协议、子域名、主域名、端口号任意一个不同,就算做不同的域,不同域相互请求资源,就是跨域

后台代理

搭建一个中间层代理服务器,让它取请求真正的目标服务器,然后把请求结果转发给前端.

因为跨域是受浏览器的同源策略导致的,而从服务器发起请求并无此限制.

jsonp

前端解决跨域问题技术,用于 get 请求,不支持 post

原理

利用 script 标签的 src 属性调用资源不受浏览器同源策略的限制,向服务端请求同时传一个 callback 回调方法名作为参数,服务端接受函数名生成返回 json 格式资源的代码。

前端:

<script>
  callback(data){
    console.log(data);
  }
</script>

<script src='xxx.com?cb=callback'>
</script>

服务端:(nodejs 示例)

let callback = req.query.cb; //获取请求参数
res.end(callback + "({name: 'Hello World!'})"); //返回到前端一个名称为callback的js函数并执行,这样在前端页面只需要定义了一个callback的函数,就可以接收到后端的数据并处理

XHR2

ie10 以下浏览器不支持,只需要在服务端设置响应头,支持 get/post 等请求 服务器端设置:(nodejs 示例)

res.header("Access-Control-Allow-Origin", "http://127.0.0.1:5502");
res.header("Access-Control-Allow-Methods", "GET,POST");