25年春招:米哈游运维开发一面总结

base上海,绝区零组,一小时左右,问得不深但是问的很广。

本人bg:双非,非科班女生,三段实习,分别是小、中、大厂,第一段和第二段都为java开发,第三段为python开发。所以很多面试都重点拷打了大厂实习内容。

1.基础情况和实习项目

1.2.了解过米哈游的游戏运维开发要做哪些事情吗?

提到自己有搜米哈游的游戏运维开发体系,但是没有搜到像腾讯蓝鲸一样的平台。然后不是特别清楚游戏运维开发和运维开发的区别。可以的话希望能说一下我个人对于运维开发或者说SRE的理解。

然后面试官说他们用的就是蓝鲸,哈哈,真可怕😱

1.3.你做xxx这个平台的话主要关注哪些指标呢?

这个问题一问,确实感觉面试官他们用过蓝鲸了,还是满熟悉的。

指标的话关注的是CPU、内存这些基础的指标之外,因为有接入三方平台,所以也会去监控三方平台的接口的p99之类的,不希望三方平台挂掉后影响到我们这边。

说思路确实是基于这种资源的拓扑层级结构的。

1.4.你做项目的这些设计是根据根据公司要求做的,还是大部分靠自己实践?

说了刚刚那种资源的拓扑结构,确实是基于已有的平台设计的。

但是前端字段的组合逻辑,是丰富了原来的逻辑。像是原来页面可能只支持某些字段的模糊查询,某些字段的AND逻辑。但是我自己做的话有去询问一下运维同学除了已有的逻辑,他们还可能怎么定位主机,譬如其实比较经常的是通过负责人+ip的模糊查询,或者ip+网段的精准查询去定位的。

所以前端字段的组合逻辑我是有去丰富的。然后接入作业平台,以及接入APM去进行运维指标可视化这些是自己的考虑。

1.5.(⭐)你做哪些方面的运维指标可视化。

监控指标方面的话,除了一些常见的基础的指标,譬如CPU、内存等。因为bk-cmdb它的核心功能是要拉到每个业务下的主机。所以会比较注重数据库方面的指标。像是sql执行的耗时,sql报错之类的监控。

还有就是bk-cmdb是接了另外一个平台的,叫作业平台,所以也会去统计这种三方系统的qps,三方接口的p95之类的情况。

至于系统稳定性保障方面的话,因为bk-cmdb是实现apm监控的。所以我可以看到调用链是什么,拓扑关系是什么,每个节点花费了多少时间,慢sql有哪些。这些指标被可视化出来,就方便运维同学去快速定位问题。这个是从运维方面去保障系统的稳定性。

1.6.(⭐)除了qps之外,你还会关注哪些指标呢?会不会去关注它的流量或者带宽呢?

1.7.你们这个监控指标是放在哪里?

放在前端页面上,就相当于放在我们的系统里面。

1.8.(⭐)你监控了第三方api的qps,当qps达到1000时,你会怎么做,是会有监控告警打出来,还是不管它?

就是告警,接入了企业微信,像 xxx 是通过腾讯内部平台提供的 API 去实现将监控告警推送到企业微信的;而在另一个项目中,我是通过 webhook 来实现这一功能的。

1.9.你在做xxx平台时,前端是用什么方式实现的?

说用的是腾讯的MagicBox框架,但实际上就是Vue框架,腾讯对它做了一个封装而已。

1.10.用的是vue 2还是vue 3?

vue3

1.11.你在做开发的过程中,主要负责前后端哪一块多一点,还是说都负责?

都负责,后端会多一点,因为前端的话主要是根据文档,然后大部分是公司的gpt辅助编写的。

1.12.(⭐)在做前后端交互时,有遇到过跨域的问题吗?

woc,我好像把CORS回答成了CSRF了......

回答的是那个是我一开始对Django设置那里的白名单域名设置的有问题。

相关知识点

django的跨域处理_哔哩哔哩_bilibili

s小楼一夜听春雨s的个人空间-s小楼一夜听春雨s个人主页-哔哩哔哩视频

跨域是什么原因

浏览器的同源策略而导致的访问限制。同源策略会阻止一个页面的js脚本和另外一个页面的js脚本交互。同源策略要求两个 URL 的协议、域名和端口都相同,否则就会被视为跨域。

比如前端项目运行在 localhost:8081 端口,而后端 API 服务运行在 localhost:8080 端口,此时前端向后端发送请求就会出现跨域。譬如http和https协议不同,就属于跨域。

CORS问题是什么?怎么解决跨域问题?

那Django解决跨域的方法,从开发角度来说还是蛮简单的,就是Django他有一个专门处理跨域的包叫django-cors-headers,那我们只需要在settings中引入这个包提供的中间件,并且配置好相关选项即可,譬如白名单域名就好了。

对于java服务,在后端的controller类上面加一个@CrossOrigin注解,即可使得控制器内所有请求都通过跨域问题。

对前端来说,那么我们发送axios请求前,要额外声明下axios发送的域名和端口号,否则它会发送到自己前端页面的域名和端口号,不会发送到后端服务的。所以需要在main.js中额外配置求根路径和端口号等等。

对于简单请求(譬如get、post),CORS的策略就是在请求时在请求头增加一个Origin字段告诉本请求来自于哪 ,服务器收到请求后,根据该字段判断是否允许该请求访问,**如果允许,则在响应的HTTP头信息中添加Access-Control-Allow-Origin**字段。

对于非简单请求的跨源请求,浏览器会在真实请求发出前增加一次OPTION请求,称为预检请求。服务器收到预检请求后,检查预检请求中的字段并判断是否允许该请求访问。

补充:CSRF问题是什么?怎么解决的?

CSRF问题全程又叫跨站请求伪造。它主要是利用浏览器会保存同源cooki的特性进行攻击的一种手段。它主要关注的是前端的一些表单的post请求。所以我们需要进行CSRF防御,也是Django那边提供了叫CSRFView的一个中间件,我们在settings中引入这个中间件之后就会默认开启CSRF防御。

当然如果是DRF的话,还需要去配置一下。因为DRF的默认认证机制更偏向于 无状态认证(如 Token 认证、JWT 认证),它不怎么依赖浏览器 Cookie。但是Django的CSRF 保护机制需要依赖浏览器Cookie和Session。

若项目为纯前后端分离架构(使用 Token/JWT 认证),则无需配置 SessionAuthentication,DRF 会自动跳过 CSRF 校验;反之,若涉及浏览器表单提交,必须显式配置以激活 CSRF 防护。

python 复制代码
REST_FRAMEWORK = { 
	'DEFAULT_AUTHENTICATION_CLASSES': [  
		'rest_framework.authentication.SessionAuthentication', 
		# 支持传统 CSRF 场景 
		'rest_framework.authentication.TokenAuthentication', 
		# 支持前后端分离场景 
	] }

还有就是CSRF信任的域之类的。

python 复制代码
CSRF_TRUSTED_ORIGINS = [
    "https://front.example.com",  # 前端域名
    "http://localhost:8080",     # 开发环境前端端口
]

具体来说,CSRFView这个包的原理就是,在客户端向后端请求页面数据的时候,后端服务向响应中的cookie设置csrf_token的值,并且在表单中添加一个隐藏字段,值就是这个CSRF_Token。

当用户进行表单提交时,我们的后端服务接收到请求,就会首先从cookie中取出csrf_token,然后从表单或者请求头中提取token,如果这两个值是一致的,那么就是合法的请求,如果是不一致的,那么代表是不合法的请求,一般会报403 Forbidden错误。

像是Django项目如果是前后端不分离,前端也用Django的模板做的话,那么直接在每个表单中用{``{ CSRF Token}}就可以了。

如果用Vue项目的Axios去进行请求的话,那我们需要在main.js里面去配置axios时配置相关的请求头。从cookie中拿到csrftoken值并且为全局的请求头注入X-CSRFToken字段。但是当时我没怎么系统地学习过前端,特别是axios相关的,我就用了个比较笨的方案,就是为需要配置的请求,去创建拦截器去添加 Token。其实因为我们CSRF_Token还是有一定周期的,不是说每次都会刷新的,所以这样弄的话没必要,不如去设置全局请求头。

补充:CORS_ALLOWED_ORGINS和CSRF_TRUSTED_ORIGINS有什么区别?SameSite机制是干什么的?

配置项 CORS_ALLOWED_ORIGINS CSRF_TRUSTED_ORIGINS
所属系统 CORS(跨域资源共享)机制 CSRF(跨站请求伪造)防护机制
作用对象 浏览器(控制前端能否发起跨域请求) 服务器(控制后端能否接受跨域请求)
生效阶段 浏览器发送请求前 服务器处理请求时
核心功能 允许前端从指定域名访问后端接口 允许指定域名的请求通过 CSRF 校验
响应头影响 添加 Access-Control-Allow-Origin 到响应头 无直接影响,仅用于服务器内部校验
典型应用场景 前后端分离架构(如 Vue/React 调用 Django API) 跨域表单提交或 AJAX 请求(需携带 Cookie)

SameSite 是一个 Cookie 属性 ,用于控制浏览器在跨域请求时如何发送 Cookie,是 防止 CSRF 攻击的重要补充机制

机制 作用层面 核心目标 典型配置
CORS 浏览器→服务器 允许跨域资源访问 CORS_ALLOWED_ORIGINS
CSRF 服务器→请求 验证请求合法性(防伪造) CSRF_TRUSTED_ORIGINS
SameSite 浏览器→Cookie 控制 Cookie 跨域传递行为 SameSite=Lax/Strict/None

2.python相关

2.1.python常见的数据类型

列表、元组、字典、集合。

2.2.哪些是不可变类型?

整数、浮点数、字符串、元组。

2.3.可变类型和不可变类型具体是什么含义?

可变类型指的是对象创建后,其值可以被修改,并且对象的内存地址保持不变。

不可变类型指的是对象一旦创建,其值就不能被修改。如果尝试修改不可变对象的值,实际上是创建了一个新的对象。

譬如如下:

python 复制代码
a = 1 
print(id(a)) # 输出 a 的内存地址 
a = 2 # 这里看似修改了 a 的值,实际上是创建了一个新的整数对象 2,并让 a 指向它 
print(id(a)) # 输出新的内存地址,与上面的不同

2.4.python里面的装饰器有听过吗?写出一个简单的无参装饰器

python 复制代码
def timer(func):
	def wrapper(*args, **kwargs):
		start_time = time.perf_count()
		result = func(*args, **kwargs)
		end_time = time.perf_count()
		logger.log(f"{func.__name__}共花费{end_time-start_time:.4f}秒")
		return result
	return wrapper

@timer
def test_case():
	print("testing..")

2.5. python里面的匿名函数有听过吗

lambda函数的基本语法是:lambda 参数: 表达式

  • 参数:可以有零个或多个参数,多个参数之间用逗号分隔。
  • 表达式 :是函数的返回值,lambda函数会自动返回这个表达式的结果。

定义一个简单的lambda函数,用于计算两个数的和 add = lambda x, y: x + y print(add(3, 5)) # 输出: 8

给了一个lambda表达式

python 复制代码
lambda x,y:x+y(1,2)

要求写成普通函数

python 复制代码
def my_add(x, y):
	return x+y

2.6.在函数里做值判断有哪种方法

可以使用 == 来判断两个值是否相等,使用 is 来判断两个对象是否为同一个对象。

2.7.python里面有一个全局解释器锁,有听过吗?

全局解释器锁(简称 GIL)是一个互斥锁,确保在同一时刻只有一个线程在解释器中执行 Python 字节码。

由于 GIL 的存在,导致python的多线程并不能充分利用多核 CPU 的优势,甚至可能因为线程切换的开销导致性能下降。所以会更加适合I/O密集型的任务,而不是CPU密集型的任务。

拓展:解决办法
多进程 :使用 multiprocessing 模块创建多个进程,每个进程都有自己独立的 Python 解释器和 GIL

2.8.Python面向对象里,反射你有用过吗?

在 Python 里,主要通过 getattr()setattr()hasattr()delattr() 这几个内置函数来实现反射。譬如去检查是否有某个属性或方法。

2.9.在写Python逻辑时,使用request请求接口,想要捕获异常该怎么做?

python 复制代码
import requests 
try: # 发送请求 
response = requests.get('https://www.example.com') 
# 检查响应状态码 
response.raise_for_status() 
except requests.exceptions.HTTPError as http_err: 
# 捕获HTTP错误,如404、500等 
print(f'HTTP error occurred: {http_err}') 
else: 
# 如果没有异常,打印响应内容 
print(response.text)

2.10.super函数是干什么的?

在 Python 中,super() 函数就是用来调用父类(超类)的一个方法。譬如,在子类的构造函数中,我们可以使用 super() 来调用父类的构造函数,以确保父类的初始化逻辑也能被执行。

3.mysql相关

3.1.在MySQL里面,有哪些常见的数据类型呢?

除了常见的一些整数类型、字符串类型,还有日期和时间类型。

在这里和redis记混了,说了bitmap......我靠......

3.2. 存储身份证号码一般用哪种MySQL数据类型

一般用字符串类型,VARCHAR数据类型

原因如下:

  • 长度可变 :身份证号码为 18 位,但可能存在特殊情况如最后一位是校验码XVARCHAR类型长度可变,可灵活存储不同情况的身份证号码,避免固定长度类型的空间浪费。
  • 无需计算:身份证号码本质是标识号码,不用于数学计算,使用字符串类型存储更符合其用途

3.3.在设置id为主键的情况下,将年龄设置为自增应该怎么做?

要求写出来代码看一下。

PRIMARY KEYAUTO_INCREMENT

sql 复制代码
-- 创建一个名为 users 的表 
CREATE TABLE users ( 
	id INT PRIMARY KEY, -- 将 id 字段设置为主键 
	age INT AUTO_INCREMENT, -- 将 age 字段设置为自增 
);

如果是对已存在的表进行修改的话,如下:

sql 复制代码
-- 假设已经存在一个名为 users 的表
-- 先将 age 字段设置为整数类型 
ALTER TABLE users MODIFY age INT; 
-- 再将 age 字段设置为自增 
ALTER TABLE users MODIFY age INT AUTO_INCREMENT;`

3.4.在数据库中,设置name(姓名)字段不能为空要怎么做?

NOT NULL约束

sql 复制代码
-- 创建一个名为 users 的表,包含 id 和 name 字段,其中 name 字段不允许为空 
CREATE TABLE users ( 
	id INT AUTO_INCREMENT PRIMARY KEY, 
	name VARCHAR(50) NOT NULL 
);

如果表已经存在,要修改name字段使其不能为空,可以使用ALTER TABLE语句,示例如下:

sql 复制代码
-- 修改 users 表,将 name 字段设置为不允许为空 
ALTER TABLE users 
MODIFY COLUMN name VARCHAR(50) NOT NULL;

3.5.mysql里面主键有什么特性?

唯一性、非空性、索引性。

3.6.唯一索引有听过吗?

3.7.主键和唯一索引有什么区别呢?

  • 主键:在一个表中,主键是唯一且不允许为空的。
  • 唯一索引:虽然也保证了索引列值的唯一性,但如果设置索引的字段本身允许空值的话,那么它也允许有空值,只是只允许有一个空值。
  • 主键:一个表只能有一个主键。
  • 唯一索引:一个表可以有多个唯一索引。

3.8.请写出查询user info表中年龄大于30且小于50的SQL语句

sql 复制代码
SELECT *
FROM user_info
WHERE age > 30 AND age < 50;

3.9.请写出查询当前公司男性员工数量和女性员工数量的SQL语句

sql 复制代码
SELECT count(gender_type), count(user_id) as gender_count
FROM user_info
GROUP BY gender_type;
sql 复制代码
SELECT 
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count, SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count FROM employees;

4.redis相关

4.1.(⭐)redis中有哪些危险命令,听说过吗?

相关知识点链接:

redis有哪些命令再生产中很危险_mob64ca12dc88a3的技术博客_51CTO博客

Redis禁用命令、危险命令及规避方法-腾讯云开发者社区-腾讯云

5.vue相关

5.1.vue 3里面不同组件传值,它有哪些方式呢?

  • props
    用于父组件向子组件传递数据。在父组件中通过属性绑定的方式传递数据,子组件通过 defineProps 来接收。
  • v-bind 动态绑定
    当需要传递多个属性时,可以使用 v-bind 动态绑定一个对象。
  • Vuex
    父组件可以修改 store 中的状态,子组件可以从 store 中获取数据。

5.2.vue 3的生命周期你有了解过吗?

  • 组件挂载阶段
    • beforeCreate:在实例初始化之后。
    • created:实例已经创建完成之后被调用。
    • beforeMount :在挂载开始之前被调用,可以使用onBeforeMount 函数
    • mounted :使用 onMounted 函数
  • 组件更新阶段:
    • beforeUpdate ,使用 onBeforeUpdate 函数
  • 组件卸载阶段:
    • beforeUnmount ,在实例销毁之前调用,使用 onBeforeUnmount 函数
    • unmounted :在实例销毁之后调用。使用 onUnmounted 函数

5.3.(⭐)ref和reactive一般什么情况下用前者定义变量,什么时候用后者。

  • reactive用于处理对象类型(包括数组、Map 等)
  • ref用于处理基本类型(如 number、string)和创建响应式引用
javascript 复制代码
import { ref, reactive } from 'vue' 
// 使用ref定义基本类型响应式数据 
const count = ref(0) 
// 使用reactive定义对象类型响应式数据 
const user = reactive({ name: 'John', age: 30 })

5.4.hook你没用过是吗?(React相关)

没有,是react框架,所以没用过。

6.linux相关

6.1.在linux操作系统里面,$0代表什么?

脚本文件名

6.2.$1代表什么?

第一个参数

6.3.$?代表什么?

它代表的是上一个命令执行后的返回状态码。

6.4.$?的返回状态码有哪些?

  • 0命令成功执行 。这是最理想的情况,表示命令按预期完成,没有出现错误。例如,当你执行 ls 命令成功列出目录内容时,$? 的值就是 0。
  • 1通用错误 。这是一个比较宽泛的错误代码,可能表示命令执行过程中出现了未明确指定的错误。比如命令的参数使用错误、文件或目录不存在等情况都可能导致返回状态码为 1。
    • 例如,当你尝试执行一个不存在的命令时,就可能返回状态码1。
    • 当用户没有足够的权限去执行某个操作时,也可能返回状态码1。比如,尝试修改一个只读文件。
  • 2误用 shell 命令 。通常是因为使用了错误的 shell 命令语法,例如在 shell 脚本中使用了不存在的内置命令。
    • 当输入的命令语法有误时,命令执行后可能返回状态码2。

6.5.(⭐)2>&1这个命令代表什么?

2>&1 是标准错误重定向到标准输出的语法,常用于将错误信息和正常输出合并。具体拆解:

  • 2:标准错误(stderr)的文件描述符
  • >:重定向符号
  • &1:引用标准输出(stdout)的文件描述符

相关知识点:

Linux shell中2>&1的含义解释 (全网最全,看完就懂)-CSDN博客

6.7.在linux中与或非用什么字符串来表示?

与:&&

或:||

非:!

6.8.linux文件权限

文件权限755代表什么含义

这波紧急挽救了属实是。

在Linux中修改文件属性或权限的命令是什么

chmod命令

复制代码
chmod 755 test.txt
chmod +X

6.9.Linux里面怎么去区分一个文件是文件还是文件夹?

复制代码
ls -l

然后看第一列的第一个字符

  • -:代表普通文件,如文本文件、二进制可执行文件等。
  • d:代表目录文件,即文件夹。

6.10.(⭐)在linux系统里面信号代表什么含义

相关知识点

【linux】信号-进程间通信的方式_哔哩哔哩_bilibili

在 Linux 系统中,信号(Signal)是内核向进程传递异步事件的一种机制 。像是最常见的kill命令底层就是一个终止信号。因为信号主要是用来终止某个进程的,所以在linux中查看系统信号有哪些,我们用的就是kill -l,六十四种死法hhh

一般最常见的就是2 SIGINT一般我们运行了某个阻塞式的命令,想要终止就会ctrl c,此时其实就是发送了sigint 2信号去停止。

其次就是普通的kill命令去接进程PID,此时其实我们发送的是15 SIGTERM,此时就可以看到被停止的进程会显示TERMINATED,如果我们想要强制杀死的话会用kill -9 PID,此时我们发送的就是9 SIGKILL,此时被终止的进程就会显示KILLED

那么在代码中其实我们是可以捕捉这些信号的,像是java的话会有singal包,那刚刚提到的SIGINT,SIGTERM这些信号都是可以被捕捉的,但是9 SIGKILL的话是不允许被捕捉的。

信号的特点

  • 异步性 :信号的接收和处理是异步的,这意味着进程在执行过程中可能随时接收到信号,而不需要主动去查询。例如,当用户在终端按下 Ctrl + C 组合键时,系统会立即向当前正在运行的前台进程发送 SIGINT 信号,进程在接收到该信号后可以选择如何响应。
  • 简单性 :信号的结构相对简单,通常只包含信号编号和可能的附加信息。每个信号都有一个唯一的编号,系统中预定义了一系列标准信号,如 SIGTERM(终止信号)、SIGHUP(挂起信号)等。

kill命令发的是什么信号

通常用于杀掉进程的信号是 SIGTERM(信号编号 15)和 SIGKILL(信号编号 9)。SIGTERM 是一个请求终止信号,它允许进程在终止前进行一些清理工作,比如保存数据、释放资源等。而 SIGKILL 是一个强制终止信号,进程无法捕获和忽略该信号,会被立即终止。

7.docker相关

7.1.使用Python写后端时,是部署在虚拟机上还是部署在k8s上?

docker上面跑

7.2. 在docker里,进入一个容器用什么命令?

复制代码
docker exec -it <容器 ID 或容器名称> <要执行的命令>

7.3.腾讯后端部署的docker服务器是用腾讯云还是开源的

说实话,我没有关注

7.4.进入一台服务器,查看该服务器发行版本的命令是什么

如果你使用的是 Red Hat、CentOS等系统,可以通过 查看 /etc/os-release 文件来获取发行版本信息。

对于 Debian、Ubuntu 等系统,这个文件会包含发行版本的相关信息。
cat /etc/debian_version

8.计算机网络

8.1.OSI七层网络模型有哪些

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

8.2.传输层有哪些常见的协议?

TCP和UDP

8.3.使用tcp协议发送的包的报文格式了解过吗?

源端口和目的端口、

序号(表示本报文段所发送数据的第一个字节的序号)、确认号(期望收到对方下一个报文段的第一个数据字节的序号)、

数据偏移(实际上就是TCP首部的长度)、

窗口(发送方让接收方设置其接收缓冲区的大小)

8.4.TCP协议报文中窗口字段是用来做什么的

窗口字段主要用于实现流量控制,其核心作用是协调发送方和接收方的数据传输速率,防止接收方因来不及处理数据而导致数据丢失。

8.5.大B和小b的区别

面到这里其实我的脑子已经有点糊涂了......

相关知识点

Mbps和MB/s有什么区别?它们之间是如何换算的_哔哩哔哩_bilibili

1Byte=8bit;1MB/s=8Mbps

前者的"B"代表"字节",英文单词为"Byte",我们平时的网络速度是这个单位。一般一个字符就是一个字节(ASCII码)

后者的"b"代表"比特",或者说"位",英文单词为"bit",我们平时的网络带宽/硬盘等大小容量也是这个单位。其实就是0或者1,代表低电平还是高电平。

1KB = 1024 Bytes

1M(其实就是1MB) = 1024 KB = 1024 * 1024 Bytes(在网络速度场景中)

1MB = 10^9Bytes(在硬盘容量场景中)

比如说企业带宽,比如说是1Gbps,那这个b代表什么含义?

意味着比特。

硬盘大小100MB中的B代表什么?为什么硬盘实际可用容量总是小于标称?

硬盘大小100MB中的B代表大B,字节(注意这里是十进制的)。

标称 "100 MB" 的硬盘,按十进制计算的实际字节数为:100 * 10^6 = 100,000,000字节(十进制)

但在计算机系统中(按二进制 计算),显示的容量会更小:100,000,000/1024/1024 = 95.37MB(二进制)。这就是为什么硬盘实际可用容量总是小于标称值的原因。

家庭带宽100兆去下载文件时,文件每秒下载量是多少?100兆带宽下载时指的是大b还是小b

每秒下载量是12.5兆字节,100Mbps = 100/8 = 12.5 MB/s

一般带宽100兆指的是100 Mbps。所以是小b。

8.6.HTTP协议里常见的状态码有哪些

2xx(成功状态码)

  • 200 OK:这是最常见的成功状态码,表示请求已成功处理,并且响应包含了请求的资源。

3xx(重定向状态码)

  • 301 Moved Permanently:表示请求的资源已经永久移动到了新的URL,客户端应该使用新的URL进行后续请求。
  • 302 Found:表示请求的资源临时移动到了新的URL,客户端可以继续使用原URL进行后续请求。

4xx(客户端错误状态码)

  • 400 Bad Request:表示客户端发送的请求有语法错误,不能被服务器所识别。
  • 401 Unauthorized:表示请求需要进行身份验证,客户端需要提供有效的身份信息才能继续请求。
  • 403 Forbidden:表示服务器理解请求客户端的请求,但是拒绝执行此请求,客户端没有权限访问该资源。
  • 404 Not Found:表示请求的资源不存在,服务器无法找到该资源。
  • 405 Method Not Allowed :表示客户端使用的请求方法(如GET、POST等)不被服务器允许,服务器会在响应的 Allow 头中列出允许的方法。

5xx(服务器错误状态码)

  • 500 Internal Server Error:表示服务器在处理请求时发生了内部错误,这是一个通用的错误状态码,通常表示服务器端出现了未知的问题。
  • 502 Bad Gateway:表示作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503 Service Unavailable:表示服务器目前无法处理请求,通常是由于服务器过载或者正在进行维护。
  • 504 Gateway Timeout:表示作为网关或者代理工作的服务器在等待上游服务器的响应时超时。

HTTP协议中状态码500代表什么?504代表什么?400代表什么?401代表什么?

500代表服务器内部错误,504代表网关超时。

400表示"Bad Request",客户端发送的请求存在语法错误

  • 参数格式错误:比如客户端传递给服务器的参数类型不符合服务器要求。例如,服务器期望接收一个整数类型的参数,但客户端传递了一个字符串。
  • 请求体格式错误:当请求包含请求体时(如POST请求),请求体的格式不符合服务器预期。例如,JSON格式的请求体存在语法错误,像缺少引号、逗号等。
  • 缺少必要参数:服务器处理请求需要某些特定的参数,但客户端在请求中没有提供这些参数。

401代表"Unauthorized",即未授权。

8.7.用get请求去传一个参数,要怎么传?get请求会有大小/字数限制嘛?

前端拼接参数到地址后面然后传参。

在 HTTP 协议中,GET 请求本身并没有明确的大小或字数限制,但在实际应用中,主要会收到浏览器、服务器等的限制。

相关推荐
七夜zippoe20 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6481 天前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满1 天前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠1 天前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9031 天前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技1 天前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀1 天前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
发现一只大呆瓜1 天前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
千寻girling1 天前
Koa.js 教程 | 一份不可多得的 Node.js 的 Web 框架 Koa.js 教程
前端·后端·面试