You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:05:23