Google Apps脚本UrlFetchApp未正确编码JSON数组

问题描述 投票:0回答:2

我到处都是,找不到这个问题。我已经从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秒]

在寻求帮助之前,我尝试了尽可能多的搜索,但是我不确定自己是否迷失了方向。有谁知道我可能在哪里寻找我所缺少的东西?谢谢。

json google-apps-script slack-api
2个回答
1
投票

基于我从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的文档中的某个地方,我只是还没来得及看。


0
投票

就此信息将近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值将导致任何默认行为分配给它。

© www.soinside.com 2019 - 2024. All rights reserved.