
在分布式系统架构设计中,API 接口既是各系统间的交互通路,更是衔接不同技术栈、组织文化与开发阶段的核心契约。
而在 RESTful API 的设计细节里,有一个看似细微、却常引发持续争论的议题:
“字段名究竟该用 camelCase(小驼峰)还是 snake_case(下划线)?”
这从来不止是审美偏好的选择,其背后直指后端持久层与前端表现层的 “阻抗失配” 问题,同时牵涉序列化性能、网络传输效率、开发者体验(DX)乃至认知心理学等多重维度。
本文将立足编程语言演进脉络、底层技术实现机制,结合 Google、Stripe 等行业巨头的架构决策实践,为这一问题提供一份可落地的决策指南。

要理解这场争论,我们必须回溯计算机语言的发展脉络。命名规范并非凭空产生,而是特定时代硬件限制与社区文化的产物。
snake_case(如 user_id)的流行可追溯到 70 年代的 C 语言和 Unix。当时的键盘设备(如 Teletype Model 33)虽然有大写键,但许多早期编译器对大小写不敏感。为了在低分辨率显示器上清晰地区分单词,程序员引入下划线模拟自然语言中的空格。这种习惯深深植根于 SQL 数据库标准中,至今 PostgreSQL 和 MySQL 的默认列名风格依然是下划线,这也为后来 API 与数据库的字段映射埋下了伏笔。
camelCase(如 userId)则随着面向对象编程(Smalltalk、C++、Java)兴起。Java 确立了“类名大驼峰,方法/变量名小驼峰”的工业标准。
决定性的转折点在于 JavaScript 的诞生。JSON 源自 JS 对象字面量,JS 标准库(如 getElementById)全面采用驼峰命名。随着 AJAX 和 JSON 取代 XML 成为数据交换霸主,camelCase 获得了 Web 领域的“原生”地位。
当数据在不同语言间流转时,不可避免地会遭遇“阻抗失配”。
classUserProfile(BaseModel):
first_name: str# 符合 Python 习惯
last_name: str
如果 API 强制返回 camelCase,就必须在序列化层配置别名(Alias)或转换器,增加了映射逻辑。
const user = awaitfetchUser();
console.log(user.first_name); // 违反 ESLint camelcase 规则
render(user.email_address);
const { first_name: firstName, last_name: lastName } = response.data;
这不仅增加样板代码,还提高出错概率。
两个常见误区:
注意:前端浏览器主线程不要做全局递归转换,否则会导致页面掉帧和内存抖动。
first_name 比 firstName 多一个字符,但开启 Gzip/Brotli 后差异几乎消失。结论:传输体积不是问题,转换工作应由后端承担。
parse_db_xml 比 parseDbXml 更快被理解。
反模式:直接透传数据库实体 → API 与 DB 强耦合,违反信息隐藏原则。
最佳实践:引入 DTO (Data Transfer Object) 层。

结语:API 设计的本质是同理心。
在 Web API 语境下,将复杂性封装在后端,便捷性留给使用者,是专业而务实的选择。

END