使用UrlFetchApp调用Clockify API获取报表时出现405错误求助
问题:Clockify API调用返回405 Method Not Allowed错误
调用Clockify详细报表API时收到以下错误:
Exception: Request failed for https://reports.api.clockify.me returned code 405. Truncated server response: {"code":405, "message": "HTTP 405 Method Not Allowed"} (use muteHttpExceptions option to examine full response)
用户使用的代码:
function getTimeReport() { var body = {"dateRangeStart":"2023-10-05T00:00:00.000Z","dateRangeEnd":"2023-05-05T23:59:59.000Z","detailedFilter":{"page":1,"pageSize":1000,"options":{"totals":"EXCLUDE"}}} var headers = { "headers": { "x-Api-Key": "XXX", "Content-type": "application/json", "Application": "Custom", "muteHttpExceptions": "true", "Method": "POST", "payload": body } }; var workspaceId = "XXX"; var url = `https://reports.api.clockify.me/v1/workspaces/${workspaceId}/reports/detailed`; Logger.log(url); var response = UrlFetchApp.fetch(url, headers); Logger.log(response); }
问题根源
- 请求参数结构错误:
muteHttpExceptions、method、payload是UrlFetchApp的顶层配置参数,不能嵌套在headers对象里。服务器收到默认的GET请求(POST配置未生效),而该API端点仅接受POST请求,因此返回405错误。 - 请求方法参数名错误:UrlFetchApp要求请求方法参数为小写的
method,而非大写的Method。 - 请求体格式错误:直接传入JavaScript对象作为payload,UrlFetchApp会自动转为
application/x-www-form-urlencoded格式,但Clockify API需要application/json格式的请求体,必须先将对象转为JSON字符串。 - 日期范围逻辑错误:
dateRangeStart(2023-10-05)晚于dateRangeEnd(2023-05-05),会导致报表无数据,虽不是405错误的原因,但需修正。
修正后的代码
function getTimeReport() { // 修正日期范围:起始日期早于结束日期 var body = { "dateRangeStart": "2023-05-05T00:00:00.000Z", "dateRangeEnd": "2023-10-05T23:59:59.000Z", "detailedFilter": { "page": 1, "pageSize": 1000, "options": {"totals": "EXCLUDE"} } }; var options = { "method": "POST", // 小写method,作为顶层参数 "headers": { "x-Api-Key": "XXX", "Content-Type": "application/json", "Application": "Custom" }, "payload": JSON.stringify(body), // 将对象转为JSON字符串 "muteHttpExceptions": true // 顶层参数,使用布尔值而非字符串 }; var workspaceId = "XXX"; var url = `https://reports.api.clockify.me/v1/workspaces/${workspaceId}/reports/detailed`; Logger.log(url); var response = UrlFetchApp.fetch(url, options); Logger.log(response.getContentText()); // 打印完整响应内容 }
关键修正点说明
- 将原
headers变量重命名为options,把method、muteHttpExceptions、payload移至顶层配置。 - 使用
JSON.stringify()转换请求体,确保服务器收到正确的JSON格式数据。 - 调整日期范围的先后顺序,保证查询逻辑有效。
- 将
muteHttpExceptions设为布尔值true,符合UrlFetchApp的参数要求。
内容的提问来源于stack exchange,提问作者Arif Ahmed
相关产品推荐
相关产品推荐

