拉力赛 API 创建 ConversationPost

Rally API create ConversationPost

使用以下代码,我正在尝试为 Capability 创建新对话 post。但是它说

由于 I/O 错误,无法将输入流解析为 JSON 文档:解析错误:预期为“{”,但看到了“” [字符读取 = >>><<< ]

function createPost(objId, post) {
  objId = "313878829904";
  post = "<p>MindMap:Hello from GAS.</p>"
  var url = "https://rally1.rallydev.com/slm/webservice/v2.0/conversationpost/create";
  
  var payload = {
    "ConversationPost": {
      "Artifact": "/portfolioitem/capability/" + objId,
      "Text": post
    }
  }
  
  var method = "POST";
  var options = optionsPost_(method, payload);
  var response = UrlFetchApp.fetch(url, optionsPost_(method, options));
  var content = JSON.parse(response.getContentText());
  content.CreateResult.Errors.forEach(error => Logger.log(error));
}

function optionsPost_(method, payload) {
  var rallyApiKey = "";
  if (rallyApiKey != "") {
    PropertiesService.getScriptProperties().setProperty("RallyApiKey", rallyApiKey);
  } else {
    rallyApiKey = PropertiesService.getScriptProperties().getProperty("RallyApiKey");
  }

  if (rallyApiKey == null) return null;

  return {
    headers: { "ZSESSIONID": rallyApiKey },
    payload: payload,
    method: method
  };
}

我找不到任何问题。 能否请你帮忙? 谢谢! 彼得

我认为根据您的错误消息,有效负载可能需要作为 JSON 数据发送。如果我的猜测是正确的,下面的修改怎么样?

修改后的脚本:

从:
return {
  headers: { "ZSESSIONID": rallyApiKey },
  payload: payload,
  method: method
};
到:
return {
  headers: { "ZSESSIONID": rallyApiKey },
  payload: JSON.stringify(payload),
  method: method,
  contentType: "application/json"
};

注:

  • 在此修改中,假设payloadrallyApiKey的值是使用API的有效值。请注意这一点。
  • 当上述修改不是您问题的直接解决方案时,能否提供您要使用的API官方文档?借此,我想确认一下。

参考:

感谢您的快速回复。 与以下

var payload = {"ConversationPost":{"Artifact": "/portfolioitem/capability/"+objId,"Text": post}};
  var method = "POST";
  var options = optionsPost_(method, payload);

var options={
    headers: { "ZSESSIONID": rallyApiKey },
    payload: payload,
    method: method,
    contentType:"application/json"
  };

它给了我

由于 I/O 错误,无法将输入流解析为 JSON 文档:解析错误:应为“{”,但看到了 'h' [ 读取的字符 = >>>h<<< ]

如果我改成

var options={
        headers: { "ZSESSIONID": rallyApiKey },
        payload: JSON.stringify(payload),
        method: method,
        contentType:"application/json"
      };

它给了我

由于 I/O 错误,无法将输入流解析为 JSON 文档:解析错误:预期为 '}' 但看到了 ',' [ 读取的字符 = >>>{"headers":{ "ZSESSIONID":"_ycHaCSd2QZSf8kbkQ0R1yhjohUvSzUYas0caApHt2A"},<<< ]

我使用的唯一文档是: https://rally1.rallydev.com/slm/doc/webservice/objectModel.sp#ConversationPost

我找不到任何区别,但这实际上开始起作用了。 我相信问题是由错误组合引起的。我删除了一个问题,但也许会添加另一个问题。 这是一个有效的代码。

function createPost(objId, post) {
  objId = '313878829908';
  post = "<p>MindMap:Hello from GAS.</p>"
  var url = "https://rally1.rallydev.com/slm/webservice/v2.0/conversationpost/create";
  var payload = {'ConversationPost':{'Artifact': '/portfolioitem/capability/'+objId,'Text': post}};
  var method = 'POST';
  //var options = optionsPost_(method, payload);
  var response = UrlFetchApp.fetch(url, optionsPost_(method, payload));
  var content = JSON.parse(response.getContentText());
  content.CreateResult.Errors.forEach(error => Logger.log(error));
}


function optionsPost_(method, payload) {
  var rallyApiKey = "";
  if (rallyApiKey != "") {
    PropertiesService.getScriptProperties().setProperty("RallyApiKey", rallyApiKey);
  } else {
    rallyApiKey = PropertiesService.getScriptProperties().getProperty("RallyApiKey");
  }

  if (rallyApiKey == null) return null;

  var options={
    'headers': {'ZSESSIONID': rallyApiKey },
    'payload': JSON.stringify(payload),
    'method': method,
    'contentType':'application/json'
  };
  return options;
}

感谢 Tanaike 的帮助。非常感谢。