在Javascript中使用Google Calendar API插入方法创建新日历会返回错误400“缺少标题”

时间:2015-08-22 15:22:23

标签: javascript api google-apps-script google-api google-calendar-api

我正在尝试使用Javascript(通过Google Apps脚本编辑器)在我的Google帐户中创建新日历。

首先,为了确保我的Oauth2正在使用Calendar API,我创建了一个GET request来获取我的主日历:

var email = 'me@mydomain.com';

var fetchArgs = {};
fetchArgs.headers = {'Authorization': 'Bearer '+ calendarOauth2Service.getAccessToken() };
fetchArgs.method = 'GET';
fetchArgs.muteHttpExceptions = true;

var url = 'https://www.googleapis.com/calendar/v3/calendars/' + email;

var response = UrlFetchApp.fetch(url, fetchArgs);

请求成功并返回此响应:

{
 "kind": "calendar#calendar",
 "etag": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"",
 "id": "me@mydomain.com",
 "summary": "me@mydomain.com",
 "timeZone": "America/New_York"
}

现在我想使用insert method将日历添加到我的帐户中:

var calendarResource = {
       "summary": "test calendar title"
      };

var fetchArgs = {};
fetchArgs.headers = {'Authorization': 'Bearer '+ calendarOauth2Service.getAccessToken() };
fetchArgs.method = "POST";
fetchArgs.data = calendarResource;
fetchArgs.muteHttpExceptions = true;

var url = 'https://www.googleapis.com/calendar/v3/calendars';

var response = UrlFetchApp.fetch(url, fetchArgs);

未创建日历,这是响应:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Missing title."
   }
  ],
  "code": 400,
  "message": "Missing title."
 }
}

我现在已经连续工作了近20个小时(不夸张),我无法理解。我尝试过以下的事情:

  1. fetchArgs.data = calendarResource;更改为fetchArgs.body = calendarResource;
  2. fetchArgs.data = calendarResource;更改为fetchArgs.resource = calendarResource;
  3. fetchArgs.data = calendarResource;更改为fetchArgs.payload = calendarResource;
  4. fetchArgs.data = calendarResource;更改为fetchArgs.summary = calendarResource;
  5. fetchArgs.data = calendarResource;更改为fetchArgs.title = calendarResource;
  6. fetchArgs.data = calendarResource;移至fetchArgs.header对象
  7. fetchArgs.method = "POST";移至fetchArgs.header对象
  8. fetchArgs.contentType = 'application/json;添加到fetchArgs对象和fetchArgs.header对象
  9. 还有很多其他的东西,现在都想不到它们
  10. 在SO上没有那么多与此相关的问题。这些是我一直在尝试的东西:

    Google Calendar REST API errors

    Google Calendar.Insert API returning 400 'required'

    以下是my original question,其中我试图在我的Google Apps域上为另一个日历执行此操作,但由于我无法使其工作,我决定创建此问题以删除域从等式中发出全局授权问题,只关注API调用。

    此外,还有一件事值得一提:我可以使用Google Calendar API Calendars: insert文档页面上的API Explorer成功创建日历。

    它向我显示请求是这样的:

    POST https://www.googleapis.com/calendar/v3/calendars
    {
     "summary": "test calendar title"
    }
    

    响应是这样的:

    200 OK
    - HIDE HEADERS -
    cache-control:  no-cache, no-store, max-age=0, must-revalidate
    content-encoding:  gzip
    content-length:  193
    content-type:  application/json; charset=UTF-8
    date:  Sat, 22 Aug 2015 14:34:05 GMT
    etag:  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    expires:  Fri, 01 Jan 1990 00:00:00 GMT
    pragma:  no-cache
    server:  GSE
    vary:  Origin, X-Origin
    {
    
     "kind": "calendar#calendar",
     "etag": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"",
     "id": "mydomain.com_xxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com",
     "summary": "test calendar title"
    }
    

    有什么想法吗?

    使用基于luc的答案的工作代码进行更新:

    需要对资源进行字符串化(Google Apps脚本调试程序显示它是一个对象,而不是字符串)。

    var calendarResource = {
           "summary": "test calendar title"
          };
    
    var fetchArgs = {};
    fetchArgs.headers = {'Authorization': 'Bearer '+ calendarOauth2Service.getAccessToken() };
    fetchArgs.method = "POST";
    fetchArgs.payload = JSON.stringify(calendarResource);
    fetchArgs.muteHttpExceptions = true;
    
    var url = 'https://www.googleapis.com/calendar/v3/calendars';
    
    var response = UrlFetchApp.fetch(url, fetchArgs);
    

1 个答案:

答案 0 :(得分:2)

首先,我怀疑你应该设置有效载荷,而不是数据。其次,传入的对象不会被解释为JSON,除非你告诉它(JSON.stringify(calendarResource))。

对于在浏览器环境中使用JavaScript的用户:

调试时,您应该尝试打印最终发送的请求(或通过开发人员工具在浏览器中查看)并将其与资源管理器中的请求进行比较。

使用JavaScript客户端库也可以省去一些麻烦。你看过这个教程吗? https://developers.google.com/google-apps/calendar/quickstart/js