从 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。那么你能试试这个修改过的脚本吗?运行时请设置notesheaders

修改后的脚本:

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。所以我有dtstartdtend 的时间应该很好。 @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 响应

如何从 POST json 中获取数据

iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

改造 2:从响应正文中获取 JSON

从 json api 获取数据但无法在 listview 中查看