使用 Mechanize ruby gem 建立 Session
最近有一個專案必須要去跟為數眾多的 Jamf Pro 伺服器進行 API 溝通。因為 Jamf Cloud 有 Load Balancer 的機制在前面,所以每次 API Request 過去時,Load Balancer 可能會指引到不同的 Web Apps。
最近有一個專案必須要去跟為數眾多的 Jamf Pro 伺服器進行 API 溝通。因為 Jamf Cloud 有 Load Balancer 的機制在前面,所以每次 API Request 過去時,Load Balancer 可能會指引到不同的 Web Apps。
本來這是一個很好的機制,確保服務品質,但由於 Jamf Cloud 伺服器在剛初始的時候,API Call 可能會被引導到還沒有初始化的 Web App 裡,就會發生 503 錯誤。但如果今天不是用 API 互動,就完全不會有這個問題,因為瀏覽器會去處理 Session 的問題,讓使用者可以維持和同一個 Web App 通訊。
在 Python 裡面有一個 requests 庫,可以使用 reqeusts.Session 起一個新的會話,就像是模擬使用者在使用服務的感覺一樣,在 Ruby 也找到一個類似的 Gem 叫做 Mechanize。
安裝方法可參考:https://github.com/sparklemotion/mechanize
但為了方便管理,我在系統上面裝了 RVM 跟 Bundler,特別的針對目前手上進行的專案做了一個 Gemfile,然後寫下:gem "mechanize"
使用方法也蠻簡單的,只要先初始化一個類似 Singleton 的物件,設定 Global Variable 也可以。http = Mechanize.new
GET 請求uri = "https://some-hostname.com"headers = {
"Authorization" => "Bearer Token",
"Accept" => "application/json"
}response = http.get(uri,nil,nil,headers)if response.code == "200"
//handle the response
end
錯誤處理
如果發生 HTTP Error 的時候,可以用 Mechanize::ResponseCodeError 捕抓並處理rescue Mechanize::ResponseCodeError => e case e.response_code when "401"handle_401() when "403"handle_403() when "404"handle_404() elsehandle_non200()end
POST 請求
跟 GET 幾乎一樣,只是請求時改成:http.post(uri,{},headers)