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

zkw*_*ntz 5 calendar google-calendar-api google-api google-api-ruby-client

我遇到了insert_calendar向Google Calendar API V3 发送请求的问题,我收到了以下回复:

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>
Run Code Online (Sandbox Code Playgroud)

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是没有遇到错误,但是日历已成功插入.

正如您从响应中看到的那样,我得不到任何回复,它告诉我,尽管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
Run Code Online (Sandbox Code Playgroud)

这些是在我们的数据模型中表示同步日历的方法.你可以打电话insert_calendar来插入它.我们总是对Google的回复采取相同的操作,如果我们要插入,更新或删除,我们总是会打电话handle_calendar_response.

vl4*_*1r4 1

由于错误出现在谷歌后端系统中,除了提交错误报告之外,您实际上无能为力修复它。但是,您可以通过添加自己的标识符并将其放入要创建的日历的私有扩展属性中来自行处理此问题。标识符可以是日期/时间和事件主题的组合,甚至可以是随机的 UIID,只要您保证它是唯一的即可。然后,在收到错误时发出另一个请求之前,请先浏览用户日历并检查同一日期是否有具有该标识符的事件。这假定您具有用户日历的读取权限。希望这可以帮助。