Skip to main content

Command Palette

Search for a command to run...

[网络] 开发向的 Http 讲解

Updated
1 min readView as Markdown
[网络] 开发向的 Http 讲解

计算机网络的知识点太多,一些部分又对开发没什么实质帮助,所以这里仅针对一些开发的场景做一些总结归纳

一、前言

首先明确一下,现在的开发涉及到http网络的地方绝大多数都是通过restful API与后端进行数据交换,所以这里仅针对restful来进行讲解,并且所涉及到的大多是一些与前后端请求和响应相关的知识点

二、AJAX 简介

ajax是指 " 异步javascriptxml" ,可以在不刷新页面的情况下和后端进行数据交互,由于其异步的特性,所以一般和promise结合使用

另外,为什么要强调 " 在不刷新页面的情况下 " 呢?因为对于非ajax请求,它是会刷新页面的,例如form表单的action属性,这个属性一般用于前后端不分离的项目中,将表单数据提交到action属性所指定的url处,然后页面就会跳转到该url

<form action="http://foo.com" method="post" enctype="multipart/form-data">
    <div>
        <label for="say">What greeting do you want to say?</label>
        <input name="say" id="say" value="Hi" />
    </div>
    <div>
        <label for="to">Who do you want to say it to?</label>
        <input name="to" id="to" value="Mom" />
    </div>
    <div>
        <button type="submit">Send my greetings</button>
    </div>
</form>

所以,form action这种数据交换的方式就不属于ajax,这种方式在现在的前后端分离的主流场景下已不多见,现在几乎都是使用restful API,也就是我们常说的get、post等请求

三、CORS 和代理

浏览器默认有同源策略,即不同协议、域名、端口的请求会被认为是跨域,从而被浏览器拦截

1. 代理

代理一般指前端配置一下代理服务器,这样子就是同源了,一般开发的时候在vite中配置server选项,webpack中配置devServer选项,在实际上线后则可以配置nginx反向代理

2. CORS

CORS指后端开启 "跨域资源共享" ,然后它有一组特定的响应头,用于告知浏览器哪些可以被跨域请求

  • Access-Control-Allow-Origin:表示允许跨域请求的域名

  • Access-Control-Allow-Headers:表示允许的请求头

  • Access-Control-Allow-Methods:表示允许的请求方法

  • Access-Control-Allow-Credentials:表示是否允许携带cookie、token这样的凭证

四、OPTIONS 预检请求

首先将一个概念,restful的请求分为简单请求和复杂请求,满足如下条件之一的则称为复杂请求:

  • 请求方法不为getpost

  • 用户设置了自定义请求头

  • Content-Type的类型不是application/x-www-form-urlencodedmultipart/form-data

当满足CORS并且请求为复杂请求时,会先发起一个options请求,询问后端是否接受本次跨域请求,后端通过设置上述的CORS响应头,来告诉浏览器是否允许本次跨域请求

首先,要明白设置cookie是浏览器行为,只有浏览器能够设置cookie

然后,cookie分为两种:session cookiepersistent cookie,分别为可持久化和不可持久化,session cookie在用户关闭浏览器后,这个cookie就没掉了

后端在响应时可以返回一个Set-Cookie的响应头,通知浏览器设置cookie,然后每次请求后端时,浏览器都会自动使用Cookie请求头来携带cookie

每当浏览器第一次请求后端时,后端会创建一个sessionID,并保留在后端,前端的一般保存方式就是通过后端返回Set-Cookie的响应头,然后设置在浏览器中,当下一次请求时作为cookiesessionID字段发回给后端

这里有一个误区,很多说法是,对于session,当用户关闭浏览器时,该session就失效了,其实这样说并不准确;对于后端,sessionID在创建后,会有一个有效时间,在这段时间内,它一直保留在服务器上,但是对于前端,存储sessionIDcookie基本上是session cookie,也就是非持久化的,当用户关闭浏览器时,这个cookie就没有了,当下一次浏览器发送请求时,这个sessionID就无法发送给后端,所以这个session就失效了,那如果是persistent cookie,就不会这样

涉及到CORS中使用cookie的有两点:

  • withCredentials:将这个设置为true,可以让浏览器在跨域请求时向后端发送cookie,但是后端的Access-Control-Allow-Origin就不可以再为*,必须指定一个具体的源,否则只能放弃cookie;另外,如果不将该项设置为true,则后端返回的Set-Cookie响应头会被忽略,即浏览器不会设置cookie

  • Access-Control-Allow-Credentials:跨域时如果发起预检请求,后端则通过这个响应头来告诉浏览器是否允许携带凭证

正常情况下,如果这两项都被正确设置的话,那么在跨域时是可以携带并设置cookie的;但是我亲测在edgeCORS时,后端的Set-Cookie并不生效,这可能和浏览器的不同实现有关,所以使用cookie时建议还是使用代理

More from this blog

[Vite] 处理静态资源路径

静态资源路径的种类 从路径的格式上来说,vite 的静态资源路径有两种:相对路径 和 绝对路径 从路径的类型上来说,vite 的静态资源路径有两种:基于 http URL 的 和 基于文件系统的 相对路径 在 vite 文档的表述中,相对路径常用于在 “嵌入式” 的页面中使用: 这里的 “嵌入式” 指的是例如浏览器插件这种,将一个页面嵌入到一个网页中的形式 绝对路径 绝对路径指的是 “以根路径为起点” 而表示的路径 绝对路径在 “基于 http URL” 和 “基于文件系统” 的情况下,最终表...

Oct 2, 20251 min read

[Node] Mac m 芯片使用 node 14

最近在 m 芯片的 mac 电脑上使用 node 14 版本,遇到了芯片架构不兼容的错误,所以记录一下解决问题的过程 遇到的问题 原因是 node 14 版本只支持 x86_64 架构的芯片,所以使用 arm 架构的 m 芯片就会报错 解决方案 前置知识 在 m 芯片的 mac 上,node 16 及以上的版本全面支持了 arm 芯片架构;如果要安装 16 以下的版本,需要通过 Rosetta 2 转译执行 步骤 按照 nvm 官方的步骤进行:https://github.com/nvm-sh/...

Jul 11, 20251 min read
[Node] Mac m 芯片使用 node 14

[其他] WSL Interop

最近在 wsl 下使用 code <dir> 命令拉起 windows 下的 vscode 客户端时,遇到了错误,搜了一下发现是 wsl 和 windows 的互操作出现了问题 这篇文章就来记录一下遇到的问题和相关的知识点 WSLInterop.conf 文件 WSLInterop.conf 文件是 WSL(Windows Subsystem for Linux)中的一个关键配置文件,它定义了 Linux 系统如何识别和处理 Windows 可执行文件 文件位置和基本作用 这个文件通常位于 /u...

Jul 11, 20252 min read
[其他] WSL Interop

lordmoon's blog

25 posts