我即將爲一些同事領導關於REST的培訓研討會,我想驗證一些關於Rails路由的問題。Rails格式說明符區別
我們目前的形式應用程序允許客戶以三種不同的方式指定格式:
1.
/path/to/resource.json
2.
/path/to/resource?format=json
3.
接受頭的要求
我的問題涉及前兩個選項:這些規範有什麼內在的區別?具體而言,他們是否只設置Accept頭或Content-Type頭?
我即將爲一些同事領導關於REST的培訓研討會,我想驗證一些關於Rails路由的問題。Rails格式說明符區別
我們目前的形式應用程序允許客戶以三種不同的方式指定格式:
1.
/path/to/resource.json
2.
/path/to/resource?format=json
3.
接受頭的要求
我的問題涉及前兩個選項:這些規範有什麼內在的區別?具體而言,他們是否只設置Accept頭或Content-Type頭?
好,1
和2
是不完全一樣的,因爲Rails的通常會產生類似的路線:
/something(.:format)
這意味着「有一個可選參數format
用點分隔」。但是,參數也可以在查詢字符串中指定,該字符串不是路由的一部分。
因此,查詢JSON的第二種方式會讓路線系統認爲format
根本不在路線中。然而,當涉及到控制器時,Rails將已經分析了該查詢字符串,並在需要響應時找到該格式。
這就是說,如果你打純/path/to/resource
沒有format
指定的任何地方,你會得到相同的結果2
:你打假設沒有給出格式的路線。儘管如此,Rails將解析頭文件並確定它應該響應的格式。
至於客戶端需要設置什麼:accept header only,Content-Type
纔有意義,當用戶自己發送的實體,它不僅關係到「應該如何Rails的解析傳入的參數」,它是不相關的響應。當然,默認情況下,Rails會盡量設置Content-Type
的響應是明智的。
謝謝你的詳細解釋。也許這是不相關的,但我會繼續問。我注意到(通過拖尾test.log和檢查控制器內的參數),當我運行我的API規範時,參數被不同地解析(數字保持爲數字,而不是被轉換爲字符串),當我明確地通過'format :: json'請求。這讓我覺得它設置了Accept頭。情況並非如此嗎? – 2014-11-24 15:47:02
@BradRice有什麼要求?從測試框架?那麼什麼參數,在查詢字符串中給出或通過'POST'和類似的東西作爲實體發送? – 2014-11-24 16:08:36
使用RSpec框架,我正在測試控制器的索引操作。 '讓(:PARAMS){{my_resource_id:my_resource.to_param,格式::JSON}}' '受試者(:invoke_request){得到:索引,則params}' 然後,在其他參數合併的上下文塊下。當我在測試中傳遞這些參數時,它們是整數。如果我不通過參數傳遞格式(如上所述),控制器將它們解析爲字符串。如果我添加格式說明符,它們被解析爲整數。 – 2014-11-24 16:12:03
這是他們如何查找頁眉內容類型爲設置。
if content_type = self[CONTENT_TYPE]
type, charset = content_type.split(/;\s*charset=/)
@content_type = Mime::Type.lookup(type)
@charset = charset || self.class.default_charset
end
,所以你甚至可以編程設置的CONTENT_TYPE到頭,或params中,作爲.format
內容類型標題! – Rubyrider 2014-11-24 15:26:35
謝謝,你有任何文件來支持它嗎?這是我最感興趣的一種。 – 2014-11-24 15:28:13
呀等我提供的詳細信息 – Rubyrider 2014-11-24 15:28:58