5

插入我運行到哪裏我送一個insert_calendar請求,谷歌日曆API V3的一個問題,我找回瞭如下回應:谷歌日曆API V3 insert_calendar返回503,但日曆已成功

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> 

我使用谷歌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,如谷歌日曆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

+3

能否請您發送代碼? –

+0

會做。道歉。 –

+1

我不認爲這是預期的。您可以通過https://developers.google.com/google-apps/calendar/support向Google提交錯誤報告。看到Google Calendar API返回的「後端錯誤」和「服務器錯誤」消息,它看起來像是它們的末端。也許你可以通過解析響應,如果它在響應正文中是503,帶有「後端錯誤」,那麼你可以在你的代碼中繼續進行,就好像它是成功的。 – petryuno1

回答

1

由於錯誤是在谷歌後臺系統確實沒有什麼可以做修復它在自己身邊拋開提交的bug報告。然而,你可以添加自己的識別碼,並把它放在你想創建日曆的私人extended properties在你身邊處理這個問題。標識符可以是事件的日期/時間和主題的組合,甚至可以是隨機UIID,只要您保證它是唯一的即可。然後,在首次發生錯誤時發出另一個請求,然後檢查用戶日曆,並檢查是否存在標識符在同一日期的事件。這假定您有閱讀用戶日曆的權​​利。希望這可以幫助。使用的是何種用途

+0

比字符串匹配更好,謝謝你的回答。 –