2013-10-03 82 views
5

我正在使用Ruby gem rest-client(1.6.7)使用HTTP GET請求檢索數據。但是,有時回覆比我想要處理的要大,所以我想要一種方法讓RestClient一旦超過我設置的尺寸限制就停止讀取。 documentationRest客戶端讀取的響應限制大小

對於通用API未覆蓋的情況,您可以使用提供較低級別API的RestClient :: Request類。

但我不明白這對我有何幫助。我沒有看到任何看起來像處理傳入數據流的鉤子,只有在整個事情被讀取後才能執行的操作。我不想浪費時間和內存讀取緩衝區中的巨大響應,而只是放棄它。

如何在GET請求中設置RestClient讀取的數據量限制?還是有一個我可以使用的不同客戶端,可以很容易地設置這樣的限制?

+1

你不能只用'Content-Length'頭來檢查響應大小,然後決定是否繼續? – EdvardM

回答

2

休息,客戶端使用Ruby的淨:: HTTP下:https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L303

不幸的是,它似乎並不像網:: HTTP會讓你放棄基於其長度的響應,因爲它使用了,畢竟,這種方法發出的所有請求: http://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html#method-i-transport_request

正如你所看到的,它使用類HTTPResponse讀取來自服務器的HTTP響應: http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTPResponse.html#method-i-read_body

類HTTPResponse好像在那裏你可以控制是否讀取所有響應和STO的地方把它重新寫入記憶中,或者閱讀並扔掉。 我甚至不想讀取響應,我想你需要關閉套接字。

我不知道是否有您需要的功能的休息客戶端。如果你想擁有如此細緻的控制,我想你需要編寫自己的小休息客戶端。

+0

我有更多時間閱讀代碼。 你可以使用':raw_response => true',在這種情況下,你可以處理塊的響應體。 https://github.com/rest-client/rest-client/blob/883903f5e5ae6c894db4e1271b3236301d881ee1/lib/restclient/request.rb#L553 請注意,身體將無論如何將被存儲。 如果你想停止閱讀這個回覆,你必須破解'fetch_body'方法來扔掉塊而不寫入任何地方。 – Timmy