创建事件时,Google Calendar API v3始终返回BadRequest 答案:修复:参考文献:

如何解决创建事件时,Google Calendar API v3始终返回BadRequest 答案:修复:参考文献:

我创建了共享日历,并希望向日历中添加事件。

我创建了一个项目并设置了服务帐户xxx@xxx.iam.gserviceaccount.com

然后,我以所有者的身份将日历共享到服务帐户。

然后我注意到

服务帐户必须手动添加共享日历

如此处所述 https://stackoverflow.com/a/62232361/298430https://issuetracker.google.com/issues/148804709

所以我写了一个代码:

 @Test
  fun addCalendarToServiceAccount() {

    val calList1: CalendarList = calendar.calendarList().list().execute()
    logger.info("calList1 = {}",calList1)

    val inserted = calendar.calendarList().insert(CalendarListEntry().setId(calendarId)).execute()
    logger.info("inserted = {}",inserted)

    val calList2: CalendarList = calendar.calendarList().list().execute()
    logger.info("calList2 = {}",calList2)
  }

它完美地工作。初次打电话时,我看到calList1为空,并且calList2包含某些内容。

然后我将一个事件手动插入日历(使用Google日历WEB UI),我想检查是否可以检索该事件:

@Test
  fun listEvents() {
    val events: Events = calendar.events().list(calendarId).execute()
    logger.info("events = {}",events)
    events.items.forEachIndexed { index,e ->
      logger.info("Event [index = {}],event = {}",index,e)
    }
  }

它也可以。

{
   "accessRole":"owner","defaultReminders":[

   ],"etag":"\"xxx\"","items":[
      {
         "created":"2020-08-17T17:51:21.000Z","creator":{
            "email":"xxx@gmail.com"
         },"end":{
            "date":"2020-08-20"
         },"htmlLink":"https://www.google.com/calendar/event?eid=xxx","iCalUID":"xxx@google.com","id":"xxx","kind":"calendar#event","organizer":{
            "displayName":"xxx","email":"xxx@group.calendar.google.com","self":true
         },"reminders":{
            "useDefault":false
         },"sequence":0,"start":{
            "date":"2020-08-19"
         },"status":"confirmed","summary":"xxx  test1","transparency":"transparent","updated":"2020-08-18T01:07:54.441Z"
      }
   ],"kind":"calendar#events","nextSyncToken":"xxx","summary":"xxx","timeZone":"Asia/Taipei","updated":"2020-08-18T01:07:54.688Z"
}

然后我要以编程方式插入一些内容,例如API示例所示:

@Test
  fun testInsertEvent() {
    val now = LocalDateTime.now().withSecond(0).withNano(0)
    val zoneId = ZoneId.of("Asia/Taipei")
    val fromDate = Date.from(now.atZone(zoneId).toInstant())
    val endDate = Date.from(now.plusMinutes(60).atZone(zoneId).toInstant())

    val event = Event()
      .setSummary("Google I/O 2015")
      .setLocation("800 Howard St.,San Francisco,CA 94103")
      .setDescription("A chance to hear more about Google's developer products.")
      .setStart(EventDateTime().setDate(DateTime(fromDate,TimeZone.getTimeZone(zoneId))))
      .setEnd(EventDateTime().setDate(DateTime(endDate,TimeZone.getTimeZone(zoneId))))

    logger.info("before insert event : {}",event)

    val eventResult: Event = calendar.events().insert(calendarId,event).execute()
    logger.info("eventResult = {}",eventResult)
  }

我可以看到客户端真正地POST到google'e端点:

Logs caught by IDEA

身体是:

{
   "description":"A chance to hear more about Google's developer products.","end":{
      "date":"2020-08-18T11:32:00.000+08:00"
   },"location":"800 Howard St.,CA 94103","start":{
      "date":"2020-08-18T10:32:00.000+08:00"
   },"summary":"Google I/O 2015"
}

但是google只是回答了400 BadRequest,没有任何进一步的描述:

2020-08-18 10:32:15.974 [main] INFO  c.g.a.c.h.HttpResponse - -------------- RESPONSE --------------
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Alt-Svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Server: ESF
X-Content-Type-Options: nosniff
Pragma: no-cache
Date: Tue,18 Aug 2020 02:32:15 GMT
X-Frame-Options: SAMEORIGIN
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Content-Encoding: gzip
Vary: Referer
Vary: X-Origin
Vary: Origin
Expires: Mon,01 Jan 1990 00:00:00 GMT
X-XSS-Protection: 0
Content-Type: application/json; charset=UTF-8

2020-08-18 10:32:15.980 [main] INFO  c.g.a.c.u.LoggingByteArrayOutputStream - Total: 171 bytes
2020-08-18 10:32:15.980 [main] INFO  c.g.a.c.u.LoggingByteArrayOutputStream - {
 "error": {
  "errors": [
   {
    "domain": "global","reason": "badRequest","message": "Bad Request"
   }
  ],"code": 400,"message": "Bad Request"
 }
}

我正在使用相同的 calendar 实例,可以成功addCalendarToServiceAccount()(作为owner)和listEvents()。 但是插入事件时出了什么问题?我有什么想念吗?

其他字段的初始化如下:

  @Value("\${google.calendar.id}")
  private lateinit var calendarId: String

  @Value("\${google.calendar.apiKey}")
  private lateinit var apiKey : String

  private val httpTransport: HttpTransport by lazy {
    GoogleNetHttpTransport.newTrustedTransport()
  }

  private val jacksonFactory: JsonFactory by lazy {
    JacksonFactory.getDefaultInstance()
  }

  private val saCredentials: GoogleCredentials by lazy {
    javaClass.getResourceAsStream("/chancer-d1de03c4c25a.json").use { iStream ->
      ServiceAccountCredentials.fromStream(iStream)
        .createScoped(listOf(
          "https://www.googleapis.com/auth/cloud-platform",*CalendarScopes.all().toTypedArray()
        ))
    }.apply {
      refreshIfExpired()
    }
  }


  private val requestInitializer: HttpRequestInitializer by lazy {
    HttpCredentialsAdapter(saCredentials)
  }

  private val calendar: Calendar by lazy {
    Calendar.Builder(httpTransport,jacksonFactory,requestInitializer)
      .build()
  }

环境:

    <java.version>1.8</java.version>
    <kotlin.version>1.4.0</kotlin.version>


    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.30.10</version>
    </dependency>
    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-calendar</artifactId>
      <version>v3-rev20200610-1.30.10</version>
    </dependency>
    <dependency>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-oauth2-http</artifactId>
      <version>0.21.1</version>
    </dependency>

解决方法

答案:

您需要使用start.dateTimeend.dateTime而不是start.dateend.date

修复:

根据documentation

end.date:如果是全天活动,则格式为“ yyyy-mm-dd”的日期。

end.dateTime:时间,作为组合的日期时间值(根据RFC3339格式化)。除非在 timeZone 中明确指定了时区,否则需要时区偏移量。

start.date:如果是全天活动,则格式为“ yyyy-mm-dd”的日期。

start.dateTime:时间,作为组合的日期时间值(根据RFC3339格式化)。除非在 timeZone 中明确指定了时区,否则需要时区偏移量。

因此,您需要从以下日期和时间设置方法更改

EventDateTime().setDate(DateTime(fromDate,TimeZone.getTimeZone(zoneId))))

收件人:

EventDateTime().setDateTime(DateTime(fromDate,TimeZone.getTimeZone(zoneId))))

将请求正文更改为:

{
  "description": "A chance to hear more about Google's developer products.","end": {
      "dateTime": "2020-08-18T11:32:00.000+08:00" // modified
  },"location": "800 Howard St.,San Francisco,CA 94103","start": {
    "dateTime": "2020-08-18T10:32:00.000+08:00" // modified
  },"summary": "Google I/O 2015"
}

您可以查看此方法here的文档。

我希望这对您有帮助!

参考文献:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-