JavaScript如何获取持续加载的text/event-stream接口的首次响应内容
解决方案
问题根源是UrlFetchApp.fetch默认需要等待请求完整结束(服务器断开连接或所有内容传输完成)才会返回,而该text/event-stream类型的SSE接口是长连接持续推送模式,服务器不会主动断开连接,因此原代码会一直挂起直到触发Google Apps Script的默认超时阈值。
方案1:配置请求超时+提取首段JSON
通过设置较短的超时时间强制终止请求,同时开启异常静默配置获取已传输的内容,再提取第一份完整JSON即可:
var url = "https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4"; var options = { timeout: 10000, // 超时时间设为10秒,可根据实际首次响应速度调整为3-15秒区间 muteHttpExceptions: true // 忽略超时等异常,强制返回已接收的响应内容 }; var response = UrlFetchApp.fetch(url, options); var rawContent = response.getContentText(); // 匹配内容开头第一份完整JSON var firstJsonStr = rawContent.match(/^\{.*?\}/s)[0]; var json = JSON.parse(firstJsonStr);
方案2:更稳妥的JSON提取(可选)
如果响应内容中存在特殊字符可能干扰正则匹配,可以用大括号计数的方式提取首段完整JSON:
var url = "https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4"; var options = { timeout: 10000, muteHttpExceptions: true }; var response = UrlFetchApp.fetch(url, options); var rawContent = response.getContentText(); function extractFirstJson(raw) { let bracketCount = 0; let endPos = -1; for (let i = 0; i < raw.length; i++) { if (raw[i] === '{') bracketCount++; if (raw[i] === '}') { bracketCount--; if (bracketCount === 0) { endPos = i; break; } } } return endPos > -1 ? raw.slice(0, endPos + 1) : ''; } var firstJsonStr = extractFirstJson(rawContent); var json = JSON.parse(firstJsonStr);
内容的提问来源于stack exchange,提问作者Kyle Dixon
相关产品推荐
相关产品推荐

