“错过结束时间”与 Google 日历和 Racket Google 套餐

2023-12-04

我正在使用一个谷歌应用程序编程接口图书馆Racket尝试更新 Google 日历。 (该 API 不完整,因此我会随时扩展它。)

我似乎在使用 events.insert put 调用将事件添加到日历时遇到问题。执行 put 的代码如下所示:

(define (insert-events calendar-id
                       event
                       #:token [t #f]
                       #:max-attendees [max-attendees #f]
                       #:send-notifications [send-notifications #f]
                       #:supports-attachments [supports-attachments #f])
  (json-api-post (string->url
                  (format
                   "https://www.googleapis.com/calendar/v3/calendars/~a/events"
                   (form-urlencoded-encode calendar-id)))
                  event
                  #:token t))


(define (json-api-post u b
                       #:token [t #f]
                       #:headers [headers '()])
  (define b* (jsexpr->bytes b))
  (let retry ([t t]
              [retry-counter 0])
    (parse-json-response
     (POST-string u b* (if t (cons (token->authorization-header t) headers) headers))
     retry
     t
     retry-counter)))

(define (POST-string u b headers)
  (port->string (post-pure-port u b headers)))

但是,无论我如何使用该调用,我总是会收到错误 400 并显示以下消息:“缺少结束时间”。我结帐了这个问题以确保我正确发送我的请求。我看起来就是这样。作为参考,我发送的 JSON 对象是:

{
 "end": {
  "dateTime": "2016-05-30T14:00:00-04:00"
 },
 "start": {
  "dateTime": "2016-05-30T13:00:00-04:00"
 }
}

另外,为了确保我正确访问正确的密钥和日历 ID,我为本地计算机设置了一个回显服务器,并将 url 从google.com to localhost,我的反应似乎很正常:

POST /<Calendar-Id-Redacted> HTTP/1.1
Host: localhost
User-Agent: Racket/6.5.0.5 (net/http-client)
Content-Length: 116
Authorization: Bearer <Key-Redacted>

{
 "end": {
  "dateTime": "2016-05-30T14:00:00-04:00"
 },
 "start": {
  "dateTime": "2016-05-30T13:00:00-04:00"
 }
}

我似乎做的一切都是正确的。即使我的 Racket 代码中存在错误,通过 Google 的开发人员 Web 控制台发送完全相同的 JSON 对象似乎也能按预期工作。那么为什么发送这个特定的 POST 不起作用呢?


关闭。但实际上您在 POST 请求的标头字段中缺少一项重要数据。即,该行:

Content-Type: application/json

使您的整个请求成为:

POST /<Calendar-Id-Redacted> HTTP/1.1
Host: localhost
User-Agent: Racket/6.5.0.5 (net/http-client)
Content-Length: 116
Authorization: Bearer <Key-Redacted>
Content-Type: application/json

{
 "end": {
  "dateTime": "2016-05-30T14:00:00-04:00"
 },
 "start": {
  "dateTime": "2016-05-30T13:00:00-04:00"
 }
}

由于某种原因,如果您丢失了它,Google 不会给您一个好的错误消息,但如果您确实有它,Google 将遵循 API 调用。

当你在curl中运行命令时,如果你像这样运行它(其中你有一个名为data.txt其中包含您的 json 对象:

curl -X POST -d @data.txt https://www.googleapis.com/calendar/v3/calendars/<Calendar-Id-Redacted>/events --header 'Authorization: Bearer <Key-Redacted>'

它会失败。但是如果你添加标题--header "Content-Type: application/json",API 将按预期工作:

curl -X POST -d @data.txt https://www.googleapis.com/calendar/v3/calendars/<Calendar-Id-Redacted>/events --header 'Authorization: Bearer <Key-Redacted>' --header "Content-Type: application/json"

将该标头添加到您拥有的库中只需对生成发布请求的函数进行一项修改:

(define (json-api-post u b
                       #:token [t #f]
                       #:headers [headers '("Content-Type: application/json")])
  ....)

它与您之前的完全相同,只是我们修改了 headers 字段以包含(默认情况下)包含字符串的列表:"Content-Type: application/json"。通过此更改,Google 应该接受您的 API。 (请注意,还有很多其他方法可以修改 headers 函数,这只是一种简单的方法。)

将它们放在一起,您的最终代码应该类似于:

(define (insert-events calendar-id
                       event
                       #:token [t #f]
                       #:max-attendees [max-attendees #f]
                       #:send-notifications [send-notifications #f]
                       #:supports-attachments [supports-attachments #f])
  (json-api-post (string->url
                  (format
                   "https://www.googleapis.com/calendar/v3/calendars/~a/events"
                   (form-urlencoded-encode calendar-id)))
                  event
                  #:token t))


(define (json-api-post u b
                       #:token [t #f]
                       #:headers [headers '("Content-Type: application/json")])
  (define b* (jsexpr->bytes b))
  (let retry ([t t]
              [retry-counter 0])
    (parse-json-response
     (POST-string u b* (if t (cons (token->authorization-header t) headers) headers))
     retry
     t
     retry-counter)))

(define (POST-string u b headers)
  (port->string (post-pure-port u b headers)))

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“错过结束时间”与 Google 日历和 Racket Google 套餐 的相关文章

随机推荐

  • 带链接的 D3 树形图

    我是新来的d3 js图书馆 我正在尝试制作一棵树this one 但带有一个转到每个节点上的外部页面的链接 是否可以 我尝试向每个节点添加一个 svg a 但使所有树都消失 Update 我从上面链接的页面的 html 中获取此代码 链接的
  • 如何允许使用 ASP.NET 下载 .json 文件

    如何从旧的 ASP NET 站点 我相信是 IIS6 下载 json 文件 我收到 404 页面而不是 JSON 文件 我需要创建 web config 文件吗 里面有什么 如果您想手动添加对站点的支持 您只需将以下内容添加到 web co
  • 在 iPhone 上创建文件夹的权限

    经过大约半年的挖掘 我发现我没有创建文件夹的权限 那么如何获得创建文件夹的权限呢 NSFileManager defaultManager createDirectoryAtPath NSString stringWithFormat do
  • 此类型可能无法实现特征“Copy”[重复]

    这个问题在这里已经有答案了 更新 最小可重现示例可在铁锈游乐场 请注意 仅在停止处添加正常的导出语句并不够 这就是为什么它不包含在原始内容中的原因 我想用 Rust 制作一本奇特的通用字典 以便更快地进行原型设计 其中的键是Strings
  • Windows 注册表文件关联菜单

    我最近 今天 开始从 Delphi 内部干预我的注册表 一切正常 我的自定义文件类型现在可以使用我的程序打开 但有两个问题我无法解决 1 我想要从所有文件类型中选择 打开方式 所以我添加了 reg TRegistry Create reg
  • 链接 Apache 库

    海湾合作委员会 4 4 2 我已经安装了 apache 运行时便携式 4月1 3 9 configure make make test make install 一切都安装得很好 我在我的 usr local apr lib以下所有库和包含
  • 将 Plist (NSString) 解析为 NSDictionary

    所以我有一个 plist 结构字符串 它是动态获取的 不是从文件系统获取的 我如何将此字符串转换为 NSDictionary 我尝试将其转换为 NSData 然后使用 NSPropertyListSerialization 转换为 NSDi
  • 绑定到 C#/WPF 中 DataTable 中包含句点的字段

    我有一个 SQL CE 数据库 该数据库超出了我的控制范围 该数据库的字段格式为 并在列名称中包含句点 这些列总是不同的 所以我不能有强类型的数据字段 我的任务是将动态表数据显示到 DataGrid 中 通常 这很容易 自动生成列 一切都很
  • 如何向 WTForms 添加 Bootstrap 验证

    我将 WTForms 与 Flask 结合使用 我想集成引导表单验证对于我的表格中的错误 我有一个基本的登录表单设置 如下所示 class LoginForm FlaskForm Login form email EmailField Em
  • PHP 8 上大于或小于比较的意外结果

    以下返回false在 PHP 7 上但是true关于 PHP 8 有人可以解释为什么会发生这种情况吗 var dump U0M262 gt 100000 字符串和数字之间的比较没有明显正确的结果 在许多语言中 它只会给出一个错误 在其他语言
  • 如何在 Swift 中设置 CADisplayLink 并在目标和 CADisplayLink 实例之间使用弱引用

    在 Objective C 中 我们可以使用代理模式初始化 CADisplayLink 来打破强引用 WeakProxy weakProxy WeakProxy weakProxyForObject self self displayLin
  • angularJS:如何在父作用域中调用子作用域函数

    如何从父作用域调用子作用域中定义的方法 function ParentCntl I want to call the scope get here function ChildCntl scope scope get function re
  • 从 C# 以编程方式使用 cmd.exe

    我想从 C 在 cmd exe 上运行一系列命令 我只需要打开一个cmd窗口 我需要在执行过程中和完成后保持cmd窗口打开 我需要显示命令 编辑 在打开的cmd窗口中 编辑 执行以及命令的输出 所以基本上我想像手动用户一样打开并使用 cmd
  • 单击 Scrapy 中的按钮

    我正在使用 Scrapy 来抓取网页 我需要的一些信息只有在点击某个按钮时才会弹出 当然点击后也会出现在HTML代码中 我发现 Scrapy 可以处理表单 如登录 如图所示here 但问题是没有表格可以填写 所以这并不是我所需要的 我怎样才
  • 是否有 Perl 模块可以使用用户可配置的分隔符轻松读取/写入 CSV 文件?

    我目前正在优化和维护一个 Perl 脚本 用于分析两个 CSV 文件的不同数据 完成数据分析后 各种结果将写入 CSV 文件 但是 根据某些命令行标志 要写入的数据将用逗号 或竖线 分隔 因此 代码有点复杂 主要是因为我的业务部门的成员无法
  • 为什么使用 .war 文件部署时 getRealPath() 返回 null? [复制]

    这个问题在这里已经有答案了 getRealPath 返回本地系统中的实际路径 但在使用 war file
  • 当 CSS 规则在 Chrome 的元素检查器中显示为灰色时,这意味着什么?

    我正在检查一个h2使用 Google Chrome 的元素检查器和一些 CSS 规则 似乎已应用 的网页上的元素显示为灰色 看起来删除线表示规则被覆盖 但是当样式变灰时意味着什么 对我来说 当前的答案没有充分解释这个问题 所以我添加这个答案
  • 使用 LINQ 查找价值最便宜的产品?

    我正在学习 LINQ 我想从以下列表中找到最便宜的产品 List
  • 更改 location.hash,然后按“后退”按钮 - IE 的行为与其他浏览器不同

    我改变location hash 在所有浏览器中 此行为均正常 页面保持原始状态 仅更改 URL 而无需重新加载页面 在 Internet Explorer 和其他浏览器中按 后退 按钮的行为有所不同 IE不改变历史记录location h
  • “错过结束时间”与 Google 日历和 Racket Google 套餐

    我正在使用一个谷歌应用程序编程接口图书馆Racket尝试更新 Google 日历 该 API 不完整 因此我会随时扩展它 我似乎在使用 events insert put 调用将事件添加到日历时遇到问题 执行 put 的代码如下所示 def