我到处都是,找不到这个问题。我已经从PeopleSoft转到.NET,并且直到最近才开始学习JavaScript,而且我正尝试使用Google Apps脚本向Slack发送电子邮件通知消息。
在我看来,GAS的UrlFetchApp无法正确处理数组。为了清楚起见,下面我没有包括所有Slack API选项。这里是我构造有效负载的方式,其中“附件”包含有问题的数组:
var payload =
{
// ...
"username": "Test webhook Bot",
"attachments": [
{
"pretext": "pre-hello1",
"text": "text-world1"
},
{
"pretext": "pre-hello2",
"text": "text-world2"
}
]
// ...
};
var options =
{
"method" : "post",
"payload" : payload,
"contentType":"application/json"
};
var response = UrlFetchApp.fetch(requestURL, options);
[进行测试时,我发现正在发帖,但Slack忽略了邮件的附件部分。我使用以下内容检查传出的POST:
var response = UrlFetchApp.getRequest(requestURL, options);
而且我在查看执行记录时发现,我的有效负载中的JSON数组未按我期望的方式进行编码。在执行之前,我清楚地看到了格式正确的数组。
[[16-01-26 07:26:39:050 MST] UrlFetchApp.getRequest([https://slack.com/api/chat.postMessage ?, {方法=发布,有效载荷= {附件= [{pretext = pre-hello1,text = text-world1 },{pretext = pre-hello2,text = text-world2}],用户名= Test webhook Bot},contentType = application / json}])[0秒]
但是实际上发送的是代替附件数组的是:%5BLjava.lang.Object; @ 37f01fb3
[[16-01-26 07:26:39:051 MST] Logger.log([测试:https://slack.com/api/chat.postMessage?attachments=%5BLjava.lang.Object;@37f01fb3&username=Test+webhook+Bot,[]])[0秒]
在寻求帮助之前,我尝试了尽可能多的搜索,但是我不确定自己是否迷失了方向。有谁知道我可能在哪里寻找我所缺少的东西?谢谢。
基于我从Google Drive Help Forum discussion收到的评论,我想传递有关我在创建Slack请求中使用JSON.stringify()的发现的更多信息。我修改了选项JSON
var options = {
'method': 'post',
'payload': JSON.stringify(payload)
};
Google在构造请求时会正确解释'attachments'数组,而我不再看到java.lang.Object错误。
[其他经验教训:在使用JSON.stringify()之前,Slack让我使用个人开发人员令牌作为有效内容的一部分进行发布。一旦我开始使用JSON.stringify(),Slack就不会接受我的个人令牌,也无法传递通道参数。这导致我直接向我想要的频道创建了一个Slack Incoming Webhook。我还没有找到为什么会这样。它可能在Slack的文档中的某个地方,我只是还没来得及看。
就此信息将近4年的时间来看,我一直遇到相同的问题,这是我想出的解决方案:-我将包括所有以URL JSON结构编码的相关信息-然后,UrlFetchApp的“选项”部分仅指定方法和contentType
一个例子看起来像这样:
var url = "https://slack.com/api/chat.postMessage?token=the-token-here&channel=channel_id_here&text=hello%20world";
var options = {
"method": "post",
"contentType": "application/json",
};
return UrlFetchApp.fetch(url,options);
}
我还在this Stack Overflow thread处获得了更多有用的信息。我认为这是Slack API文档,可以帮助解释这些限制:
JSON编码的主体
对于这些写方法,您也可以发送HTTP POST数据作为内容类型:application / json。
有一些基本规则:
您必须将Content-type HTTP标头明确设置为应用程序/ json。如果没有这些信息,我们将不会解释您的POST正文它。您必须在令牌中将令牌作为承载令牌传输授权HTTP标头。您不能将令牌作为查询字符串或作为发布的JSON中的属性。不要混在一起查询字符串,URL编码的POST正文和JSON之间的参数属性。每个请求选择一种方法。提供明确属性的null值将导致任何默认行为分配给它。