从 Sling API JSON Post 获取代码 500
Posted
技术标签:
【中文标题】从 Sling API JSON Post 获取代码 500【英文标题】:Getting code 500 back from Sling API JSON Post 【发布时间】:2018-06-01 20:15:25 【问题描述】:看来 Sling (sling.is) 更新了 their API,但从未发送过包含警告或信息的电子邮件,因此我的脚本已损坏。我的代码的最终目标(在更新之前运行良好)是在公司活动获得批准后简单地将员工的班次发布到 Sling。
我在谷歌应用程序脚本中运行所有这些代码,因为我需要从电子表格中提取数据来创建班次。该代码首先将班次“添加”到系统中,然后“发布”这些班次,以便所有员工都能看到它们。我设法弄清楚如何修复第一部分,因为他们似乎改变了一些基本语法。但我无法终生弄清楚如何修复第二(出版)部分。
Sling 不为他们的 API 提供任何支持,所以我认为在这里发帖将是我的下一个最佳选择。
这是我收到的错误:
"https://api.sling.is/v1/shifts/sync 的请求失败,返回代码 500. 截断服务器响应:“消息”:“糟糕,发生意外错误。”(使用 muteHttpExceptions 选项检查完整响应) (第 257 行,文件“代码”)”
//CREATE SHIFTS ON SLING
//This is pulling data from google spreadsheet cells
var staff = getByName('Attendants', row);
var start = Utilities.formatDate(getByName('Date', row),
ss.getSpreadsheetTimeZone(), "YYYY-MM-dd") + "T" +
Utilities.formatDate(getByName('Starting Time of Attendants', row),
ss.getSpreadsheetTimeZone(), "H:mm") + ":00.000-04";
var end = Utilities.formatDate(getByName('Date', row),
ss.getSpreadsheetTimeZone(), "YYYY-MM-dd") + "T" +
Utilities.formatDate(getByName('Ending Time of Attendants', row),
ss.getSpreadsheetTimeZone(), "H:mm") + ":00.000-04";
var notes = getByName('City', row) + ", " + getByName('Event Type', row)
var payload =
"available": true,
"dtstart": start,
"dtend": end,
"location":
"id": 1022310
,
"position":
"id": 1022302
,
"summary": notes,
"user":
"id": 1
;
var headers =
"Authorization" : "9e632842f4e61927336337f1aa65b75c"
;
var options =
'method' : 'post',
'contentType': 'application/json',
'headers' : headers,
'payload' : JSON.stringify(payload)
;
for(i=1; i<=staff; i++)
UrlFetchApp.fetch("https://api.sling.is/v1/shifts?
ignoreConflicts=false&publish=true", options);
// All of that ^^ works
var payloadtwo =
"summary": notes
;
var optionstwo =
'method' : 'post',
'contentType': 'application/json',
'headers' : headers,
'payload' : JSON.stringify(payloadtwo)
;
UrlFetchApp.fetch("https://api.sling.is/v1/shifts/sync", optionstwo);
我什至尝试从 JSON 选项中完全删除有效负载(正文)参数。
var payloadtwo =
"summary": notes,
"dtstart": "2018-11-07T12:00:00:00.000-04",
"dtend": "2018-11-09T12:00:00:00.000-04"
;
var optionstwo =
'method' : 'post',
'contentType': 'application/json',
'headers' : headers
;
UrlFetchApp.fetch("https://api.sling.is/v1/shifts/sync", optionstwo);
然后它说
“https://api.sling.is/v1/shifts/sync 的请求失败,返回代码 400。 截断的服务器响应: "message": "发布需要一个日期范围或一个列表 events"(使用 muteHttpExceptions 选项检查完整响应) (第 256 行,文件“代码”)”
Sling API 的轮班发布功能“文档”可在此处获得:https://api.sling.is/#/shifts/post_shifts_sync
任何帮助将不胜感激。
【问题讨论】:
我们能问一下您目前的情况吗?错误消息显示Publishing requires either a date range or a list of events
。您是否已经考虑过这个问题?
是的。我添加了正确的 ISO 8601 格式的日期,然后它会抛出第一个错误消息代码 500。
感谢您的回复。您问题中的脚本是您的最新版本吗?
是的,这就是我现在的脚本。我已经尝试了我能想到的一切,没有任何东西可以使最后一部分起作用。
感谢您的回复。从Publishing requires either a date range or a list of events
的错误和您问题中的脚本来看,似乎没有使用a date range or a list of events
。那么考虑一下怎么样?
【参考方案1】:
从您的问题中的the API document 看来,请求正文似乎是一个包含数组的对象。似乎关键是event
。那么你能试试这个修改过的脚本吗?运行时请设置notes
和headers
。
修改后的脚本:
var payloadtwo =
"event": [ // or "Event"
"summary": notes,
"dtstart": "2018-11-07T12:00:00:00.000-04",
"dtend": "2018-11-09T12:00:00:00.000-04",
]
;
var optionstwo =
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payloadtwo),
'headers': headers,
'muteHttpExceptions': true,
;
var res = UrlFetchApp.fetch("https://api.sling.is/v1/shifts/sync", optionstwo);
Logger.log(res)
注意:
如果出现错误,请将'payload': JSON.stringify(payloadtwo),
修改为'payload': payloadtwo,
重新运行。
我无法尝试测试,因为我没有帐户。所以如果这个脚本出现错误,请告诉我。我想考虑其他修改点。
编辑1:
修改后的脚本:
var payloadtwo = [
"summary": notes,
"dtstart": "2018-11-07T12:00:00:00.000-04",
"dtend": "2018-11-09T12:00:00:00.000-04",
];
var optionstwo =
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payloadtwo), // or payloadtwo
'headers': headers,
'muteHttpExceptions': true,
;
var res = UrlFetchApp.fetch("https://api.sling.is/v1/shifts/sync", optionstwo);
Logger.log(res)
【讨论】:
感谢您的帮助,但我仍然收到相同的错误消息。notes
已分配,headers
已分配。这两个都在第一步中使用,并且都可以正常工作。当我将您的代码与JSON.stringify
一起使用时,我得到"message": "Oops, an unexpected error occured."
。然后没有JSON.stringify
,我得到"message": "Publishing requires either a date range or a list of events"
。活动轮班时间为 11 月 8 日 (2018-11-08) 美国东部时间 (-04) 下午 4:15-9:15。所以我有dtstart
和dtend
的时间应该很好。
@Alex James 对于给您带来的不便和我糟糕的技能,我真的很抱歉。我更新了我的答案。你能再试一次吗?
不用抱歉,你在帮忙。所以这次使用编辑后的代码,当我在没有JSON.stringify
的情况下运行它时,我在顶部(不在日志中)收到一个错误代码,上面写着Attribute provided with invalid value: payload (line 255, file "Code")
。当我使用JSON.stringify
运行它时,我在日志中得到"message": "Oops, an unexpected error occured."
。
@Alex James 例如,对于我回答中的上述脚本,您可以将event
修改为Event
并再试一次吗?并且当错误发生时,我可以询问您有关 API 的其他文档或示例吗?
@Alex James 顺便说一下,文档中的示例请求正文似乎有"id": 0,
。是否必须包含在内?以上是关于从 Sling API JSON Post 获取代码 500的主要内容,如果未能解决你的问题,请参考以下文章
使用来自网站 API 的 POST 请求获取 Json 数据 [重复]
如何使用 Django 从 POST 表单中获取 JSON 响应