http 请求
http 是一种无状态协议:不建立持久连接,不保留客户端信息,当一次请求完成后,连接就中断了
一次完整的 http 请求过程
- 建立 tcp 连接
- 浏览器向服务器发送请求命令
- 浏览器发送头信息
- 服务器应答
- 服务器应答头信息
- 服务器向浏览器发送数据
- 关闭 tcp 连接
http 请求的四个组成部分
- 请求方式:get/post
- url
- 请求头:客户端环境信息、身份验证信息等
- 请求体:客户端提交的查询字符串、表单信息等
get/post 区别
- get:用于获取信息,使用 url 传递参数,发送信息的大小有限制,幂等(查询一次和查询无数次得到的结果是相同的)
- post:用于修改服务器资源,发送数据无限制
http 响应的三个部分
- 状态码:成功或失败
- 响应头
- 响应体
状态码
- 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");