常见面试题问题及答案
1、什么是API端点(API endpoint)?说说相关技术点
用于访问特定资源或功能的网络地址或URI,代表了API的一个具体操作或服务,并定义了客户端与服务器之间进行交互的方式;
1:URI(统一资源标识符),包含了协议(如HTTP/HTTPS)、主机名、路径、查询参数等
2:请求方法,GET(获取数据)、POST(提交数据)、PUT(更新数据)、DELETE(删除数据)等
3:路由(Routing),在服务器端,路由机制负责将请求的URI与具体的处理函数或控制器进行匹配。路由会解析请求的路径和方法,决定如何处理请求并生成响应
4:参数和查询字符串,API端点可以接受路径参数(如/users/{id}中的{id})、查询参数(如?search=keyword),以及请求体中的数据。这些参数用于指定请求的详细信息和过滤条件
5;请求和响应格式,通常使用标准的格式,如JSON(JavaScript Object Notation)或XML(eXtensible Markup Language)。定义清晰的数据格式可以提高API的可用性和一致性
6:身份验证和授权,确保只有经过验证的用户才能访问特定的数据或功能。常见的方法包括API密钥、OAuth 2.0、JWT(JSON Web Tokens)等
7:错误处理,处理和返回适当的错误信息,以帮助客户端理解问题的原因。常见的错误代码有404(未找到)、500(服务器错误)等。
relational DB(关系型数据库)与NoSQL DB(非关系型数据库)有什么区别?该如何选型?
主要区别
**数据模型**:
关系型数据库(Relational DB):使用表格结构,数据以行和列的形式存储。表格通过外键关系相互连接,遵循结构化查询语言(SQL)标准。
非关系型数据库(NoSQL DB):采用不同的数据模型,包括键值对、文档、列族和图模型。数据存储方式较为灵活,不强制使用表格结构。
**查询语言**:
关系型数据库:使用SQL(Structured Query Language)来进行查询、更新和管理数据。
非关系型数据库:查询方式因数据库类型而异,可能使用JSON查询语法、MapReduce、或者数据库特定的查询语言。
**事务处理**:
关系型数据库:通常支持ACID(原子性、一致性、隔离性、持久性)事务特性,保证数据的一致性和完整性。
非关系型数据库:事务支持不一定符合ACID标准,更多的是基于最终一致性(Eventual Consistency),适合在大规模分布式环境中处理。
**扩展性**:
关系型数据库:通常水平扩展(增加更多的节点)比较困难,更多依赖于垂直扩展(增加单节点的资源)。
非关系型数据库:设计上通常支持水平扩展,能够更容易地在多个节点之间分布数据和负载。
**数据一致性**:
关系型数据库:提供强一致性,即对数据的操作能够立即在所有查询中体现。
非关系型数据库:有些数据库提供最终一致性,即系统会在一定时间内达到一致状态,但短时间内可能出现数据不一致。
**模式**:
关系型数据库:数据模式是固定的,表结构在创建时定义,数据插入和修改时需要符合模式。
非关系型数据库:数据模式通常是动态的,数据可以以不同的格式存储,提供更大的灵活性。
应用场景:
关系型数据库:适合传统业务应用、ERP系统、CRM系统等。
非关系型数据库:适合大数据应用、实时分析、内容管理系统、社交网络等。
什么是REStful API,其设计核心原则(core principle)是什么?
RESTful API(Representational State Transfer API)是一种基于REST架构风格的网络接口,广泛用于构建和设计Web服务
1、每次请求都是独立的,服务器不会保存客户端的状态信息
2、每个资源通过URL(统一资源定位符)进行唯一标识
3、RESTful API应遵循一组统一的接口约定,使得不同的客户端能够以相同的方式访问和操作资源。统一接口包括:
资源的表示:资源可以通过不同的格式(如JSON、XML)进行表示。
HTTP方法:使用标准的HTTP方法(GET、POST、PUT、DELETE)来操作资源。
一个典型的HTTP请求/响应周期(request/response cycle)是怎样的,从建立连接开始。
1、建立连接:浏览器(客户端)将请求的域名解析(DNS解析)为IP地址,客户端与服务器之间通过三次握手建立TCP连接
2、发送HTTP请求:
①:请求构造:客户端构造HTTP请求消息,包括请求行、请求头和可选的请求体。
请求行:包括HTTP方法(如GET、POST)、请求目标(URL)和HTTP协议版本(如HTTP/1.1)。
请求头:包含一些元数据,如User-Agent、Accept、Content-Type等。
请求体:如果HTTP方法是POST或PUT,可能包含要发送到服务器的数据。
②:请求发送:客户端将构造好的请求通过TCP连接发送给服务器。
3、服务器处理请求
接收请求:服务器接收并解析HTTP请求消息。
处理请求:服务器根据请求的内容和请求头进行相应的处理,包括访问数据库、执行计算等。
构造响应:服务器构造HTTP响应消息,包括响应行、响应头和响应体。
响应行:包括HTTP协议版本、状态码(如200 OK、404 Not Found)和状态消息。
响应头:包含响应的元数据,如Content-Type、Content-Length、Set-Cookie等。
响应体:包含实际的数据,如HTML内容、JSON数据等。
4. 发送HTTP响应:服务器将构造好的响应通过TCP连接发送回客户端。
5. 客户端处理响应:接收并解析HTTP响应消息,根据响应内容和响应头的指示进行后续操作。例如,浏览器会渲染HTML页面、执行JavaScript代码或处理返回的数据
6. 关闭连接
保持连接:如果HTTP协议使用了持久连接(如HTTP/1.1的Connection: keep-alive),TCP连接会保持一段时间,以便进行后续的请求/响应交换。
关闭连接:如果HTTP协议使用了非持久连接(如HTTP/1.0),或者服务器/客户端明确关闭连接,TCP连接会被关闭。
7. 缓存和其他操作
缓存:如果响应头中包含缓存控制指令(如Cache-Control),客户端可以将响应内容缓存起来,以便在后续请求时使用,减少网络负担。
Cookie处理:如果响应头中包含Set-Cookie,客户端会保存这些Cookie并在后续请求中发送回服务器。
总结:HTTP请求/响应周期涉及从客户端与服务器建立TCP连接到发送请求和响应,再到处理响应和关闭连接的完整过程。这一过程保证了客户端和服务器之间的有效数据交换。
web应用中,session是如何创建与管理的?
Session(会话)用于在多个 HTTP 请求之间存储用户的状态和数据。由于 HTTP 协议本身是无状态的,每个请求都是独立的,Session 机制允许服务器在用户的不同请求之间保持一定的状态。
1. Session 的创建
用户发起请求:
当用户首次访问 Web 应用时,通常没有现存的 Session 信息。
服务器生成 Session ID:服务器生成一个唯一的 Session ID(会话标识符)。这个 ID 是一个随机生成的字符串,用于唯一标识一个用户的会话。
发送 Session ID 给用户:服务器将生成的 Session ID 通过 Cookie 或其他机制(如 URL 参数)发送给用户的浏览器。最常见的是使用 Cookie,将 Session ID 存储在用户的 Cookie 中。
创建 Session 对象:服务器端会创建一个 Session 对象,并将其与生成的 Session ID 关联起来。Session 对象用于存储用户的状态数据,例如用户信息、购物车内容等。
2. Session 的管理
处理后续请求:
用户在后续的请求中,会自动将存储有 Session ID 的 Cookie 随请求发送到服务器。
服务器端查找 Session:服务器通过收到的 Session ID 查找对应的 Session 对象。如果 Session 存在,服务器会恢复之前存储的状态信息。
更新 Session 数据:用户在请求过程中可以修改或添加 Session 数据。例如,用户登录后,服务器会在 Session 中存储用户的身份信息。
保存和维护 Session:服务器会定期保存和维护 Session 数据。Session 数据通常保存在内存中,也可以存储在数据库、分布式缓存(如 Redis)等地方,以支持负载均衡和高可用性。
3. Session 的过期与销毁
Session 过期:为了防止过期的 Session 占用资源,服务器通常会设置 Session 的过期时间。过期时间可以基于最后一次访问时间或固定时间段。
有些 Web 应用允许用户自定义 Session 的过期时间或在用户闲置一定时间后自动过期。
Session 销毁:当用户注销或 Session 过期时,服务器会销毁相应的 Session 对象,并清除与之相关的 Session ID。
客户端的 Cookie 也会被删除或失效。
如何避免SQL注入(SQL injection attack)的?
使用准备好的语句或ORM框架。
进行输入验证和清理。
遵循最小权限原则。
避免动态SQL构造。
采用安全的编码实践。
你对HTTP无状态(statelessness)的概念是怎么理解的,这对后端服务的设计会产生什么影响?
指每个 HTTP 请求都是独立的,服务器不会保留客户端的状态或上下文信息.服务器在处理每一个请求时,并不会记住之前的请求或与之相关的信息。每个请求都是全新的,必须携带所有必要的信息以便服务器能够理解和处理
HTTP 的无状态性对于后端服务的设计带来了重要影响,主要体现在会话管理、数据存储、负载均衡、缓存、安全性以及故障处理等方面
怎么保证你设计的API是安全的?
1、身份验证和授权:使用强认证机制(如OAuth2、JWT)验证用户身份,并实施细粒度授权控制。
2、输入验证:对所有用户输入进行严格验证,确保输入符合预期格式,避免SQL注入和跨站脚本(XSS)攻击。
3、数据加密:在传输和存储过程中加密敏感数据,使用HTTPS加密通信,确保数据的保密性和完整性。
4、错误处理:避免暴露内部错误信息,提供通用的错误信息,以防泄露系统信息。
5、API速率限制:实施速率限制(Rate Limiting)防止滥用和拒绝服务(DoS)攻击。
6、日志记录:记录安全相关事件和访问日志,以便检测和响应潜在的安全问题。
你的后端程序如何应对流量激增(traffic surge),此时你如何扩展后端应用程序(scale backend application)?
1. 水平扩展(Horizontal Scaling):增加实例、负载均衡、容器化
2. 垂直扩展(Vertical Scaling):增加CPU、内存或存储
3. 缓存:使用缓存机制(如Redis、Memcached)缓存频繁访问的数据,减少对数据库的直接查询,降低系统负担
4. 数据库优化:数据库分片、读写分离、优化查询
5. 异步处理:使用消息队列(如RabbitMQ、Kafka)处理异步任务
6. 服务拆分(Microservices Architecture):微服务架构
7. 性能优化:对应用代码进行优化,减少计算复杂度,提高处理速度
8. 灾备和容错
如何保证你写的代码容易理解且便于维护,谈谈你的理解
1、遵循编程规范
2、编写清晰的文档
3、单一职责原则
4、避免复杂的嵌套
5、编写单元测试
6、使用配置文件