如何修复来自 Google 广告 API 的无效 JSON 负载错误

How to fix Invalid JSON payload error from the Google Ads API

我正在尝试将 Google 广告 API 中的报告提取到 Google 工作表中,但我无法让 API 将我的查询识别为查询

这是我得到的代码和错误:

    function basicReport() {
  var query = {
    "query" : "SELECT campaign.name, campaign.status FROM campaign ORDER BY campaign.id"
  };
  
  var body = JSON.stringify(query);
  
  var head = {
    'Developer-token' : "<Dev token>",
    'login-customer-id' : <Manager ID>,
    'Authorization' : "Bearer <Auth token>",
  };

var options = {
  'method' : 'POST',
  'content-type': 'application/json',
  'headers' : head,
  'payload' : body,
  'muteHttpExceptions' : true
};
  
var response = UrlFetchApp.fetch('https://googleads.googleapis.com/v4/customers/<Customer ID>/googleAds:searchStream', options);
  var json = response.getContentText();
  var data = JSON.parse(json);

但我经常收到错误消息:

"error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"{\"query\":\"SELECT campaign.name, campaign.status FROM campaign ORDER BY campaign.id\"}\": Cannot bind query parameter. Field '{\"query\":\"SELECT campaign' could not be found in request message.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "description": "Invalid JSON payload received. Unknown name \"{\"query\":\"SELECT campaign.name, campaign.status FROM campaign ORDER BY campaign.id\"}\": Cannot bind query parameter. Field '{\"query\":\"SELECT campaign' could not be found in request message."

我在 OAuth 游乐场 (https://developers.google.com/oauthplayground) 中 运行 查询并且它在那里工作,所以我知道查询没问题。

我尝试将正文作为对象而不是字符串传递,但随后出现 500 错误。

以防其他人正在寻找这个 - 我确实解决了它。

在header中设置时,Content-Type有破折号,在选项中设置时,contentType没有。

function basicReport() {
     var query = {
        "query" : "SELECT campaign.name, campaign.status FROM campaign ORDER BY campaign.id"
     };
  
     var body = JSON.stringify(query);
  
     var head = {
        'developer-token' : "<Dev token>",
        'login-customer-id' : "<Manager ID>",
        'authorization' : "Bearer <Auth token>",
        'accept' : 'application/json'
        'Content-Type': 'application/json',
     };

    var options = {
        'method' : 'POST',
        'headers' : head,
        'payload' : body,
        'muteHttpExceptions' : true
    };
  
    var response = UrlFetchApp.fetch('https://googleads.googleapis.com/v4/customers/<Customer ID>/googleAds:searchStream', options);
    var json = response.getContentText();
    var data = JSON.parse(json);

    Logger.log(data);