测验:框架藏起来的那些东西
路径存在,但不接受所用的请求方法时,正确的状态码是什么?
- 404 — 与资源不存在同等处理
- 405 — 资源存在,只是不允许该操作
- 400 — 请求有误
- 501 — 服务器未实现该功能
路由规则没有生效时,最先应该检查什么?
- 注册顺序和模式的匹配范围 — 宽泛模式在前面会让后面的规则无法命中
- 处理函数内部的逻辑
- 响应头中的 Content-Type 设置
- 服务器监听的端口号
把已保存的对象直接 return,真正的风险是什么?
- 响应变大,传输变慢
- JSON 序列化遇到循环引用错误
- 将来新增一个列时,API 响应会悄然改变
- 客户端会依赖字段顺序
过滤输出中的敏感字段时,为什么使用允许列表而不是 delete?
- 因为 delete 的性能较差
- 因为 delete 会修改原对象
- 因为排除法会在每次出现新字段时继续泄露
- 因为允许列表让代码更短
使用依赖注入最根本的原因是什么?
- 方便编写单元测试
- 框架规定必须这样做
- 让上层模块不依赖下层模块的具体实现
- 减少创建对象的开销
用了 DI 后仍无法替换依赖,最常见的原因是什么?
- 构造函数参数太多
- 为了方便而直接 import 全局单例
- 使用具体类型而不是接口
- 注入容器的配置太长
在处理请求时阻塞事件循环,会观察到什么?
- 只有 CPU 使用率下降
- 只有该请求变慢,其他请求正常
- 在处理期间,定时器和其他请求都会延迟
- 内存使用量激增
测试 API 契约时,为什么通常最好不要启动服务器?
- 避免端口冲突和时序波动,让测试失败真正反映代码问题
- 因为网络层没有测试价值
- 因为启动服务器会让测试总是通过
- 因为 HTTP 是标准,无需验证