1. HTTP方法名规范:从RFC到代码实现
HTTP方法名作为请求的"动作标识符",其命名规范绝非随意制定。根据RFC 7231第4.1节定义,方法名必须是由大写字母组成的"令牌"(token)。这个看似简单的定义在实际开发中却暗藏玄机。我曾在一个电商项目中,因为团队自定义了"GET_ITEMS"方法名导致整个支付流程崩溃——下划线虽然符合RFC规范,但目标服务器使用的老旧框架却将其视为非法字符。
RFC规范中明确允许的字符包括:
- 大写字母A-Z
- 数字0-9
- 特殊字符:
!#$%&'*+-.^_|~
但实际开发中要注意三个关键点:
- 大小写敏感:虽然规范建议使用大写,但
GET和get在技术上是等效的。不过我在压力测试中发现,某些CDN服务会将小写方法名自动转换为大写 - 长度限制:理论上方法名长度无限制,但Apache的默认配置限制在8192字节
- 扩展方法:像WebDAV定义的PROPFIND、REPORT等方法名,需要确保中间件支持
java复制// 典型错误示例:包含非法空格
String method = "GET ITEMS"; // 触发IllegalArgumentException
// 正确写法
String method = "GET_ITEMS"; // 符合RFC规范但需确认服务器兼容性
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 异常解析:Invalid character的六种常见来源
这个异常信息看似简单,但根据我处理过的案例,非法字符通常隐藏在以下六个层面:
2.1 用户输入污染
前端表单未做校验时,用户可能输入包含emoji的方法名。去年我们系统就遭遇过攻击者故意提交GET%20%F0%9F%98%8A这样的恶意请求。
排查技巧:
java复制// 使用正则校验方法名
if (!method.matches("^[A-Z0-9!#$%&'*+-.^_`|~]+$")) {
throw new IllegalArgumentException("Invalid HTTP method");
}
2.2 编码转换问题
当请求经过多层代理时,字符编
