如何用R的httr包构造Canvas API嵌套请求体修改display_items?
解决Canvas API修改测验设置的400错误问题
问题根源
你的代码存在两个关键错误:
- URL路径错误:Canvas官方API的测验更新端点是
/api/v1/courses/{course_id}/quizzes/{quiz_id},你写的/api/quiz/v1/...多了一层冗余的quiz,导致请求路由解析失败。 - 请求体结构错误:Canvas要求所有测验相关的修改参数必须嵌套在
quiz这个顶级列表下,你把quiz_settings、course_id等放在了顶层,不符合API的参数格式要求;另外URL已经包含了course_id和quiz_id,不需要在请求体里重复传递。
正确的代码实现
# 修正后的API端点URL url <- "https://XXX.instructure.com/api/v1/courses/16867/quizzes/147030" # 正确构造请求体:所有参数嵌套在quiz下 body <- list( quiz = list( title = "CHANGE TITLE", # 可选:仅需修改标题时保留 show_correct_answers = TRUE, quiz_settings = list( result_view_settings = list( result_view_restricted = TRUE, display_items = FALSE ) ) ) ) # 发送PATCH请求 response <- PATCH( url, add_headers(Authorization = paste("Bearer", token)), body = body, encode = "json" ) # 可选:打印响应内容排查问题 # content(response)
额外注意事项
- 确保
token拥有课程编辑、测验修改的权限,权限不足也会导致请求失败。 - 如果仅需修改
display_items,可以去掉title等非必要参数,只保留需要的嵌套结构。 - 布尔值直接使用R原生的
TRUE/FALSE即可,无需转换为字符串。
内容的提问来源于stack exchange,提问作者User33
相关产品推荐
相关产品推荐

