使用 Google 日历 API 插入方法创建新日历 Javascript returns 错误 400 "Missing title"
Creating a new calendar using the Google Calendar API insert method in Javascript returns error 400 "Missing title"
我正在尝试使用 Javascript(通过 Google Apps 脚本编辑器)在我的 Google 帐户中创建一个新日历。
首先,为了确保我的 Oauth2 正在使用日历 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);
请求成功并且returns这个响应:
{
"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 个小时(毫不夸张),但我无法弄清楚。我尝试了以下操作:
- 将
fetchArgs.data = calendarResource;
更改为 fetchArgs.body = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为 fetchArgs.resource = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为 fetchArgs.payload = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为 fetchArgs.summary = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为 fetchArgs.title = calendarResource;
- 将
fetchArgs.data = calendarResource;
移动到 fetchArgs.header
对象中
- 将
fetchArgs.method = "POST";
移动到 fetchArgs.header
对象中
- 将
fetchArgs.contentType = 'application/json;
添加到 fetchArgs
对象和 fetchArgs.header
对象
- 还有很多其他的,暂时想不起来
SO 上与此相关的问题并不多。这些是我一直在尝试的东西:
Google Calendar REST API errors
Google Calendar.Insert API returning 400 'required'
这是 my original question,我在其中尝试为我的 Google 应用程序域上的另一个日历执行此操作,但由于我无法让它工作,我决定创建这个问题是为了从等式中删除域范围的委托问题,只关注 API 调用。
此外,还有一件事值得一提:我能够使用 Google Calendar API Calendars: insert 文档页面上的 APIs 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);
首先,我怀疑您应该设置有效载荷,而不是数据。第二个传入的对象不会被解释为 JSON 除非你告诉它 (JSON.stringify(calendarResource)).
对于在浏览器环境中使用 JavaScript 的用户:
调试时,您应该尝试打印最终发送的请求(或通过开发人员工具在浏览器中查看)并将其与资源管理器中的请求进行比较。
同时使用 JavaScript 客户端库可以为您省去一些麻烦。你看过这个教程吗? https://developers.google.com/google-apps/calendar/quickstart/js
我正在尝试使用 Javascript(通过 Google Apps 脚本编辑器)在我的 Google 帐户中创建一个新日历。
首先,为了确保我的 Oauth2 正在使用日历 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);
请求成功并且returns这个响应:
{
"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 个小时(毫不夸张),但我无法弄清楚。我尝试了以下操作:
- 将
fetchArgs.data = calendarResource;
更改为fetchArgs.body = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为fetchArgs.resource = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为fetchArgs.payload = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为fetchArgs.summary = calendarResource;
- 将
fetchArgs.data = calendarResource;
更改为fetchArgs.title = calendarResource;
- 将
fetchArgs.data = calendarResource;
移动到fetchArgs.header
对象中 - 将
fetchArgs.method = "POST";
移动到fetchArgs.header
对象中 - 将
fetchArgs.contentType = 'application/json;
添加到fetchArgs
对象和fetchArgs.header
对象 - 还有很多其他的,暂时想不起来
SO 上与此相关的问题并不多。这些是我一直在尝试的东西:
Google Calendar REST API errors
Google Calendar.Insert API returning 400 'required'
这是 my original question,我在其中尝试为我的 Google 应用程序域上的另一个日历执行此操作,但由于我无法让它工作,我决定创建这个问题是为了从等式中删除域范围的委托问题,只关注 API 调用。
此外,还有一件事值得一提:我能够使用 Google Calendar API Calendars: insert 文档页面上的 APIs 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);
首先,我怀疑您应该设置有效载荷,而不是数据。第二个传入的对象不会被解释为 JSON 除非你告诉它 (JSON.stringify(calendarResource)).
对于在浏览器环境中使用 JavaScript 的用户:
调试时,您应该尝试打印最终发送的请求(或通过开发人员工具在浏览器中查看)并将其与资源管理器中的请求进行比较。
同时使用 JavaScript 客户端库可以为您省去一些麻烦。你看过这个教程吗? https://developers.google.com/google-apps/calendar/quickstart/js