使用Java HttpsURLConnection调用Amazon FSx DescribeFileCaches API遇404错误求助
问题排查与修复建议
1. 核心错误:x-amz-target 值不正确
你当前使用的 AWSSimbaAPIService_v20180301.DescribeFileCaches 是Amazon Redshift相关服务的目标标识,并非FSx服务的正确值。FSx的DescribeFileCaches API对应的正确x-amz-target应为:
String target = "AmazonFSx20180301.DescribeFileCaches";
UnknownOperationException 错误几乎都是因为目标操作名称不匹配导致的,这是最可能的根因。
2. 移除手动设置的content-length头
手动指定content-length为"2"存在风险:如果后续payload内容变化、或编码方式(如非UTF-8编码)导致实际字节数与设定值不一致,会触发服务器解析错误或签名验证失败。HttpsURLConnection会自动计算并设置正确的Content-Length,直接删除这行代码即可:
// awsHeaders.put("content-length", "2"); // 移除该行
3. 确保所有请求头都参与AWS V4签名
你在代码中额外添加了Accept: application/json头,但这个头未加入用于签名的awsHeaders集合。AWS V4签名要求所有发送的请求头(除少数默认忽略的)都必须参与签名计算,否则会导致签名验证失败。需将Accept头加入awsHeaders:
awsHeaders.put("Accept", "application/json");
同时删除后续单独设置Accept的代码行:
// httpsURLConnection.setRequestProperty("Accept", "application/json"); // 删除该行
4. 验证自定义AWSV4Auth类的签名逻辑
如果上述修改后仍有问题,需检查你使用的AWSV4Auth类实现是否符合AWS V4签名规范:
- 确认Canonical Headers按名称字典序排列(你用了TreeMap,这部分是正确的)
- 确认Payload的SHA-256哈希计算正确,空payload
{}的哈希值应为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 确认签名时自动添加了
x-amz-date头等必要参数
修改后的关键代码片段
TreeMap<String, String> awsHeaders = new TreeMap<String, String>(); awsHeaders.put("content-type", "application/x-amz-json-1.1"); awsHeaders.put("host", "fsx.us-east-1.amazonaws.com"); // 使用正确的x-amz-target值 String target = "AmazonFSx20180301.DescribeFileCaches"; awsHeaders.put("x-amz-target", target); // 将Accept头加入签名用的headers集合 awsHeaders.put("Accept", "application/json"); // 后续签名和请求代码保持不变,移除单独设置Accept的行
内容的提问来源于stack exchange,提问作者Meiruko
相关产品推荐
相关产品推荐

