什么是HTTP协议 ?
- 必答内容:
HTTP协议就是 "超文本传输协议",规定了客户端与服务器端数据通信的规则。 而HTTP协议,它的底层是基于TCP协议的,而TCP协议呢,是面向连接、安全且无状态的协议。
那在现在的Web开发中,基本上所有的请求都是基于HTTP协议 或 HTTPS协议的。
- 可能追问的问题:
1). 那HTTP协议与HTTPS协议的区别是什么 ?
- 那HTTP协议与HTTPS协议最大的区别,当然是数据传输的安全性了。 HTTP协议的信息是以明文传输,如果敏感信息被截取了,是可以直接获取传递的信息的。 相对之下,HTTPS协议是基于SSL加密传输的信息,可以确保数据的安全传输。
- 还有呢,就是端口不同。 HTTP协议默认端口 80,而HTTPS协议默认的端口 443。
所以说,HTTP协议的安全性没有HTTPS高,但是HTTPS协议会比HTTP耗费更多的服务器资源。
HTTP协议中请求方式GET 与 POST 什么区别 ?
- 必答内容:
那两种请求方式,使我们进行项目开发,最为常见的两种请求方式。 两者的区别主要有以下几点:
- 传递参数的大小限制不同。GET请求参数在URL中传递,所以参数的大小会收到URL长度的限制。 而POST请求,是在请求体中传递参数,只受到服务器端的配置限制。
- 安全性不同。 GET请求的参数暴露在URL中,安全性较低,不适合传递敏感信息。 而POST请求参数在HTTP消息体中传递,安全性相对较高。
- 应用场景不同。 GET请求一般用于获取数据,而POST请求则用于提交数据。
- 进阶回答:
那在项目开发中,现在的url风格,基本都是restful风格。所以呢,项目开发中,请求方式除了GET、POST之外,还有像PUT、POST也是非常常用的。
- 可能会继续追问的问题:
你刚才提到Restful,什么是Restful,谈谈你的理解?
Restful其实就是一种软件架构风格,那既然是一种风格,就说明是可以被打破的,项目开发可以不按这套风格来。 但是我之前接触的项目,都是Restful风格的。 按照我的理解,Restful风格的两大特点:
- 通过请求url地址,来定位要操作的资源。(如:http://localhost:8080/users/1,通过这个url,我就知道对1号用户资源进行操作)
- 通过请求方式,来决定对资源进行什么样的操作。比如,GET 方式,就是用来查询的;POST方式,就是用来新增的;PUT方式,就是用来修改数据的;而DELETE方式就是用来删除数据的。
HTTP协议中常见的状态码 ?
HTTP协议的状态码,大的方面来说,分为5类, 分别是1xx,2xx,3xx,4xx,5xx。而在项目开发中,最为常见的状态码有这么几个:
- 101:这个状态码,表示临时状态码,表示请求已经接受,服务器正在处理 (之前项目中,使用websocket时见到这个状态码)
- 200:这个状态码,是最常见的,表示请求成功。
- 302:表示重定向。
- 401:表示此次请求需要用户身份认证,未认证就响应401。
- 404:表示服务器无法找到对应的资源(请求路径找不到)。
- 500:服务器内部错误。
转发 与 重定向的区别?
这个在现在的前后端分离开发中,基本上就不存在对应的转发操作 和 重定向操作了。
- 转发是指服务器收到用户请求后,在服务器端将请求转发给另一个资源进行处理,然后将处理结果返回给用户,用户并不知道这个过程,是服务器内部完成的,整个过程只有一次请求。
- 重定向是指当用户访问某个URL时,服务器返回一个特殊的响应码(3xx),并通过响应头(Location)告诉浏览器需要跳转到另一个URL。浏览器收到重定向响应后,会向新的URL发起新的请求,然后显示新页面的内容。整个过程对于浏览器来说是两次请求。
总的来说,重定向是在客户端发生的,浏览器需要重新发送请求;而转发是在服务器端发生的,对于客户端来说是透明的
MySQL数据库中的 char 与 varchar的区别是什么?
MySQL中的 char 和 varchar 都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:
第一点呢,就是存储方式不同:
- char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字符的空间。
- varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。 如:varchar(10) 表示最多可以存储10个字符,如果存储的字符串长度不足10,假设为5,只会占用5个字符空间。
第二点呢,就是性能不同:
- 对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题。
- 对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。
所以呢,我们在设计表结构的时候,需要根据具体的场景来选择具体的数据类型。 就比如啊,如果是手机号、身份证号这样的字段,由于长度固定,我们就直接选择char类型即可,并指定长度,如:char(11)、char(18)。再比如,像用户名、备注信息这类长度不固定的,我们直接选择varchar类型,长度根据页面原型和需求文档确定。
什么是事务以及事务的四大特性?
- 必答内容:
事务是数据库中的基本概念,是指一组操作的集合,而这一组操作要么同时成功,要么同时失败,从而保证数据库中数据的正确性和完整性。
那事务呢,具有四大特性,也就是我们常说的ACID,分别是:原子性、一致性、隔离性、持久性。 那接下来,我就分别来聊聊这四大特性。
1). 原子性指的是事务中的这一组操作,是不可分割的最小操作单元了,操作要么全部成功,要么全部失败。
2). 一致性是指在事务操作的前后,必须使数据处于一致的状态。
3). 隔离性指的是数据库中提供了隔离机制,保证事务在不受外部并发操作的影响的独立环境中运行。
4). 持久性就比较简单了,就是事务一旦提交或回滚了,它对数据库的改变就是永久的。
- 可能继续发问的问题:
1). 你刚才提到了并发事务,那并发事务回引发哪些问题?
并发事务引发的问题,主要有这么几个:
- 脏读:就是一个事务,读取到了另一个事务还没有提交的数据。
- 不可重复读:指的是在同一个事务中,先后读取同一条记录,但两次读取的数据不同。
- 幻读:指的是一个事务按照条件查询数据时,没有对应的行,但是插入时,又发现这行数据已经存在了好像出现了幻觉。
2). 如何解决这些问题呢?
那这些问题,在数据库系统中都已经解决了。在数据库中提供了不同的隔离级别来解决这些问题, 分别有以下几种:
- READ UNCOMMITED :读未提交。 这种隔离级别下,会出现脏读、不可重复读、幻读问题。
- READ COMMITED:读已提交。 这种隔离级别,解决了脏读问题,但是会出现不可重复读、幻读问题。
- REPEATABLE READ:可重复读。这种隔离级别,解决了脏读、不可重复读问题,但是会出现幻读问题。
- SERIALIZABLE:串行化。解决了上述所有的并发事务问题。
而在MySQL数据库中,默认的隔离级别是 REPEATABLE READ(可重复读)。
3). 那为什么没有用SERIALIZABLE(串行化) 这种隔离级别呢?
其实,隔离级别,也不是越高越好。因为隔离级别高了,确实可以解决并发事务引发的问题,但是隔离级别越高,性能也越低。