Google Calendar API V3 insert_calendar返回503,但日历已成功插入

时间:2017-08-25 22:03:07

标签: google-api calendar google-api-ruby-client google-calendar-api

我遇到了向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

1 个答案:

答案 0 :(得分:1)

由于错误发生在谷歌后端系统中,除了提交错误报告之外,你可以做很多事情来解决它们。但是,您可以通过添加自己的标识符并将其放在要创建的日历的私有extended properties中来处理此问题。标识符可以是事件的日期/时间和主题的组合,甚至是随机的UIID,只要您保证它是唯一的。然后,在您收到错误之前发出另一个请求之前,请先查看用户日历,然后检查在同一日期是否存在带有标识符的事件。这假定您具有用户日历的读取权限。希望这会有所帮助。