我遇到了向Google Calendar API V3发送insert_calendar
请求的问题,我收到了以下回复:
Sending HTTP post https://www.googleapis.com/calendar/v3/calendars?
503
#<HTTP::Message:0x000000124eb008
@http_header=#<HTTP::Message::Headers:0x000000124eafe0
@http_version="1.1",
@body_size=0,
@chunked=false,
@request_method="POST",
@request_uri=#<Addressable::URI:0x9275f20 URI:https://www.googleapis.com/calendar/v3/calendars?>,
@request_query=nil,
@request_absolute_uri=nil,
@status_code=503,
@reason_phrase="Service Unavailable",
@body_type=nil,
@body_charset=nil,
@body_date=nil,
@body_encoding=#<Encoding:UTF-8>,
@is_request=false,
@header_item=[
["Vary", "Origin"],
["Vary", "X-Origin"],
["Content-Type", "application/json; charset=UTF-8"],
["Content-Encoding", "gzip"],
["Date", "Fri, 25 Aug 2017 20:16:34 GMT"],
["Expires", "Fri, 25 Aug 2017 20:16:34 GMT"],
["Cache-Control", "private, max-age=0"],
["X-Content-Type-Options", "nosniff"],
["X-Frame-Options", "SAMEORIGIN"],
["X-XSS-Protection", "1; mode=block"],
["Server", "GSE"], ["Alt-Svc", "quic=\":443\"; ma=2592000; v=\"39,38,37,35\""],
["Transfer-Encoding", "chunked"]
],
@dumped=false>,
@peer_cert=#<OpenSSL::X509::Certificate:
subject=#<OpenSSL::X509::Name:0x00000012600998>,
issuer=#<OpenSSL::X509::Name:0x000000126009c0>,
serial=#<OpenSSL::BN:0x000000126009e8>,
not_before=2017-08-15 16:06:52 UTC,
not_after=2017-11-07 16:04:00 UTC
>,
@http_body=#<HTTP::Message::Body:0x000000124eaf68
@body="{\n \"error\": {\n \"errors\": [\n{\n \"domain\": \"global\",\n \"reason\": \"backendError\",\n \"message\": \"Backend Error\"\n }\n ],\n \"code\": 503,\n \"message\": \"Backend Error\"\n }\n}\n",
@size=0,
@positions=nil,
@chunk_size=nil
>,
@previous=nil>
Caught error Server error
Error - #<Google::Apis::ServerError: Server error>
我正在使用Google API Ruby客户端,详情请点击:
google-api-client (0.13.1)
addressable (~> 2.5, >= 2.5.1)
googleauth (~> 0.5)
httpclient (>= 2.8.1, < 3.0)
mime-types (~> 3.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.0)
我遇到的问题是没有遇到错误,但是日历已成功插入。
正如您从回复中看到的那样,我没有得到任何回复,它告诉我,尽管有503
,例如Google日历ID,它仍然是成功的。
这对我的应用程序的影响是我不知道我已成功同步,事实上,通过关注文档,我实现了指数退避,因此我继续在用户的Google日历上创建重复的日历
最后,我有一堆孤儿日历出现,我必须用字符串匹配删除。
这是预期的吗?我有什么办法可以缓解这种情况吗?
这种情况经常发生,并不是一个孤立的案例。
有问题的代码:
def handle_calendar_response(response, error)
self.update_column('last_synced_at', Time.now.utc)
if error.present?
Airbrake.notify('Sync Calendar Sync Error', {
error: error,
message: error.message,
calendar: self
})
# String match :(
if error.message =~ /not.?found/i || error.message =~ /forbidden/i
Airbrake.notify('Removing user deleted calendar', {
calendar: self,
google_calendar_id: self.google_calendar_id,
error: error,
message: error.message
})
self.publish_to_google = false
self.google_calendar_id = nil
self.save!
end
end
end
...
def insert_calendar
@client.insert_calendar(google_calendar_object) do |response, error|
handle_calendar_response(response, error)
if response.present?
self.google_calendar_id = response.id
self.save!
end
end
end
这些是来自我们数据模型中同步日历表示的方法。您可以致电insert_calendar
进行插入。我们始终对Google的回复采取相同的操作,如果我们要插入,更新或删除,我们始终致电handle_calendar_response
。
答案 0 :(得分:1)
由于错误发生在谷歌后端系统中,除了提交错误报告之外,你可以做很多事情来解决它们。但是,您可以通过添加自己的标识符并将其放在要创建的日历的私有extended properties中来处理此问题。标识符可以是事件的日期/时间和主题的组合,甚至是随机的UIID,只要您保证它是唯一的。然后,在您收到错误之前发出另一个请求之前,请先查看用户日历,然后检查在同一日期是否存在带有标识符的事件。这假定您具有用户日历的读取权限。希望这会有所帮助。