UrlFetchApp调用Canvas LMS API时JSON返回结果被截断问题求助
请提供需要使用Markdown格式化的具体内容,我会严格按照你指定的规则进行处理。
如果是针对你之前提出的Canvas LMS API作业获取截断问题,以下是符合要求的Stack Overflow风格回答(已按Markdown格式化):
解决Canvas LMS API获取作业结果被截断的问题
问题场景
我使用以下代码从Canvas LMS API拉取课程作业:
var response = UrlFetchApp.fetch(canvas_link + "api/v1/courses?access_token="+api_key+"&enrollment_state=active"); var courses = JSON.parse(response.getContentText()); var assignments = UrlFetchApp.fetch(canvas_link + "api/v1/courses/" + courses[3].id + "/assignments?access_token="+api_key) var assignmentsArray = JSON.parse(assignments)
代码逻辑是先通过API密钥获取活跃课程,再用指定课程ID请求对应作业。但每次返回的assignmentsArray长度最多只有10,课程作业超过10个时就会被截断,作业不足10个时返回实际数量。
我试过用UrlFetchApp.getRequest()拿到请求链接在浏览器里执行,能正常返回所有作业的JSON;也给UrlFetchApp.fetch(url, options)加过请求头和其他参数,都没解决问题。
解决方案
Canvas LMS API默认采用分页机制,单次请求最多返回10条数据,这就是你遇到截断问题的核心原因。要获取所有作业,需要处理分页逻辑:
1. 提升单次请求返回数量(简单方案)
通过per_page参数提高单次请求的返回条数(Canvas API允许最大设置为100):
var assignments = UrlFetchApp.fetch(canvas_link + "api/v1/courses/" + courses[3].id + "/assignments?access_token="+api_key+"&per_page=100")
2. 完整分页遍历逻辑(通用方案)
如果作业总数超过100,需要循环遍历所有分页。Canvas API的响应头中Link字段会标记下一页地址,可通过该字段实现全量获取:
function getAllAssignments(courseId, apiKey, canvasLink) { var allAssignments = []; var nextPageUrl = canvasLink + "api/v1/courses/" + courseId + "/assignments?access_token=" + apiKey + "&per_page=100"; while (nextPageUrl) { var response = UrlFetchApp.fetch(nextPageUrl); var pageAssignments = JSON.parse(response.getContentText()); allAssignments = allAssignments.concat(pageAssignments); // 解析响应头的Link字段,提取下一页地址 var linkHeader = response.getHeaders()['Link']; nextPageUrl = null; if (linkHeader) { var links = linkHeader.split(','); for (var link of links) { if (link.includes('rel="next"')) { nextPageUrl = link.match(/<(.*)>/)[1]; break; } } } } return allAssignments; } // 调用示例 var response = UrlFetchApp.fetch(canvas_link + "api/v1/courses?access_token="+api_key+"&enrollment_state=active"); var courses = JSON.parse(response.getContentText()); var assignmentsArray = getAllAssignments(courses[3].id, api_key, canvas_link);
补充说明
浏览器中请求正常是因为Canvas前端界面会自动处理分页加载逻辑,但直接调用原生API时必须显式处理分页参数或遍历分页链接。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

