"Hora de término ausente" com o Google Calendar e o pacote Racket do Google
Estou usando umAPI do Google biblioteca paraRaquete para tentar atualizar um calendário do Google. (A API está incompleta, por isso estou estendendo-a à medida que a uso.)
Parece que tenho problemas ao adicionar eventos a um calendário usando a chamada de chamada events.insert. O código que faz o put se parece com:
(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)))
No entanto, não importa como eu use a chamada, sempre recebo um erro 400 com a mensagem: "Hora de término ausente". Eu verifiqueiessa questão para garantir que eu estava enviando minha solicitação corretamente. O que eu pareço ser. Para referência, o objeto JSON que estou enviando é:
{
"end": {
"dateTime": "2016-05-30T14:00:00-04:00"
},
"start": {
"dateTime": "2016-05-30T13:00:00-04:00"
}
}
Além disso, para garantir que eu estava acessando corretamente a chave e o ID do calendário corretos, configurei um servidor de eco para minha máquina local e alterei o URL degoogle.com
paralocalhost
, minha resposta parece normal:
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"
}
}
Parece que estou fazendo tudo certo. E mesmo que houvesse um erro no meu código Racket, enviar exatamente o mesmo objeto JSON pelo console da web do desenvolvedor do Google parece funcionar como pretendido. Então, por que o envio desse POST em particular não funciona?