尝试连接AWS AppSync Websocket时遇HttpNotFoundException错误求助
问题排查与解决方法
错误原因分析
你遇到的HttpNotFoundException(400错误)主要由以下两个原因导致:
- Base64编码不符合URL安全要求:原生
btoa生成的标准Base64包含+、/、=这些特殊字符,直接作为URL参数会被服务器解析错误,导致无法匹配正确的端点。 - 初始连接Payload格式不正确:AppSync的WebSocket连接要求初始Payload必须指定协议版本,空对象不符合协议规范。
解决步骤
1. 替换为URL安全的Base64编码
将标准Base64转换为URL安全格式,替换特殊字符并去除填充:
function urlSafeBase64(str) { return btoa(str) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, ''); }
2. 修正初始Payload结构
AppSync要求初始Payload必须包含version字段,值为"1.1":
const payload = { version: "1.1" };
3. 完整修正后的代码
let ws = undefined; const url = 'wss://XXXX.appsync-realtime-api.YYYY.amazonaws.com/graphql'; const apikey = 'ZZZZ'; // 转换为URL安全的Base64编码 function urlSafeBase64(str) { return btoa(str) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, ''); } const api_header = { host: 'XXXX.appsync-realtime-api.YYYY.amazonaws.com', 'x-api-key': apikey, }; // 修正Payload,添加协议版本 const payload = { version: "1.1" }; const base64_api_header = urlSafeBase64(JSON.stringify(api_header)); const base64_payload = urlSafeBase64(JSON.stringify(payload)); const appsync_url = url + '?header=' + base64_api_header + '&payload=' + base64_payload; ws = new WebSocket(appsync_url, ['graphql-ws']);
额外检查项
- 确认URL中的
XXXX(API ID)和YYYY(AWS区域)完全正确,与AppSync控制台显示的一致。 - 确保API Key
ZZZZ有效且未过期,并且该Key对应的权限允许建立WebSocket连接。
内容的提问来源于stack exchange,提问作者DarkTrick
相关产品推荐
相关产品推荐

