尝试在 GAS 中创建 GCM 通知密钥时出现错误"NOT A JSON REQUEST"



我正在尝试使用Google Apps Script服务器在Google Cloud Messaging 上创建一个用户通知组。 我在这里按照指示进行操作:http://developer.android.com/google/gcm/notifications.html

我收到以下错误:

请求失败 https://android.googleapis.com/gcm/notification 返回代码 400。截断的服务器响应: {"错误":"NOT_A_JSON_REQUEST"}(使用 muteHttpExceptions 选项来 检查完整响应)(第 86 行,文件"代码")

function SetUserNotification(data) {
  var url = "https://android.googleapis.com/gcm/notification";
  var apiKey = "<MyApiKey>";
  var projectID = "<MyProjectId>";
  var registrationId = data[2];
  var headers = {
      "Content-Type": "application/json",
      "project_id": projectID,
      "Authorization": "key=" + apiKey
    };
  var payload = { 
      "operation": "create",
      "notification_key_name": "ST-User" + data[3],
      "registration_ids": registrationId
   };
    var params = {
      headers: headers,
      method: "post",
      payload: payload
    };
    var response = UrlFetchApp.fetch(url, params);
  Logger.log("response = " + response.getContentText());
  return {message: "send completed: " + response.getContentText()};
  }

我做错了什么? 我找不到任何在线创建通知密钥的示例,只是似乎是不完整的说明。

更新:这是来自 fetch 函数的执行脚本。请注意,第 87 行是获取调用。

[15-01-25 21:55:11:877 EST] UrlFetchApp.fetch([https://android.googleapis.com/gcm/notification, {headers={Authorization=key=MYAUTHKEY, project_id=MYPROJID, 内容类型=应用程序/json}, payload={"operation":"create","notification_key_name":"ST-User1","registration_ids":"[abcdefgblahblah]"}, 方法=发布}]) [0.015 秒]

[15-01-25 21:55:11:879 EST] 执行失败:请求失败 https://android.googleapis.com/gcm/notification 返回代码 400。 截断的服务器响应:{"错误":"NOT_A_JSON_REQUEST"} (使用 muteHttpExceptions 选项用于检查完整响应)(第 87 行,文件 "代码") [0.019 秒总运行时间]

您需要将有效负载转换为 JSON,因为这不会自动完成。 使用 javascript 的内置 JSON 对象执行此操作,如下所示。

此外,不能像在代码中那样通过 Headers 参数重写内容类型标头。 必须改用单独的 contentType 参数。

var headers = {
  "project_id": projectID,
  "Authorization": "key=" + apiKey
};
var params = {
  headers: headers,
  method: "post",
  contentType: 'application/json',
  payload: JSON.stringify(payload)
};

请参阅此处的高级参数部分:https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)

和 JSON 文档在这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON#Methods

我发现了!!

function registerForKey(){
  var url = "https://android.googleapis.com/gcm/notification";
  var headers = {"content-type": "application/json","project_id": proj,    "Authorization": "key=" + api  };
  var request = {"operation": "create",   "notification_key_name": groupname,   "registration_ids": [id]};
  var pay = JSON.stringify(request);
  var params = {"headers": headers,"method": "POST",  "payload": pay }; 
  var respo = UrlFetchApp.fetch(url,params)
  
  Logger.log(respo);
  
  
  }

请注意a)在标题中,内容类型必须如何编写,所有微小的和特征之间;b) 有效载荷需要串化;c) 插入一个真实 ID 作为请求 ID,否则会给出错误!

因此,只需复制此代码段,插入所需的所有变量,运行然后进行 CTRL+Enter 和...瞧!:)

享受:D

最新更新