2014-11-24 129 views
0

我即將爲一些同事領導關於REST的培訓研討會,我想驗證一些關於Rails路由的問題。Rails格式說明符區別

我們目前的形式應用程序允許客戶以三種不同的方式指定格式:

1.

/path/to/resource.json 

2.

/path/to/resource?format=json 

3.

接受頭的要求

我的問題涉及前兩個選項:這些規範有什麼內在的區別?具體而言,他們是否只設置Accept頭或Content-Type頭?

+0

內容類型標題! – Rubyrider 2014-11-24 15:26:35

+0

謝謝,你有任何文件來支持它嗎?這是我最感興趣的一種。 – 2014-11-24 15:28:13

+0

呀等我提供的詳細信息 – Rubyrider 2014-11-24 15:28:58

回答

0

好,12是不完全一樣的,因爲Rails的通常會產生類似的路線:

/something(.:format) 

這意味着「有一個可選參數format用點分隔」。但是,參數也可以在查詢字符串中指定,該字符串不是路由的一部分。

因此,查詢JSON的第二種方式會讓路線系統認爲format根本不在路線中。然而,當涉及到控制器時,Rails將已經分析了該查詢字符串,並在需要響應時找到該格式。

這就是說,如果你打純/path/to/resource沒有format指定的任何地方,你會得到相同的結果2:你打假設沒有給出格式的路線。儘管如此,Rails將解析頭文件並確定它應該響應的格式。

至於客戶端需要設置什麼:accept header onlyContent-Type纔有意義,當用戶自己發送的實體,它不僅關係到「應該如何Rails的解析傳入的參數」,它是不相關的響應。當然,默認情況下,Rails會盡量設置Content-Type的響應是明智的。

+0

謝謝你的詳細解釋。也許這是不相關的,但我會繼續問。我注意到(通過拖尾test.log和檢查控制器內的參數),當我運行我的API規範時,參數被不同地解析(數字保持爲數字,而不是被轉換爲字符串),當我明確地通過'format :: json'請求。這讓我覺得它設置了Accept頭。情況並非如此嗎? – 2014-11-24 15:47:02

+0

@BradRice有什麼要求?從測試框架?那麼什麼參數,在查詢字符串中給出或通過'POST'和類似的東西作爲實體發送? – 2014-11-24 16:08:36

+0

使用RSpec框架,我正在測試控制器的索引操作。 '讓(:PARAMS){{my_resource_id:my_resource.to_param,格式::JSON}}' '受試者(:invoke_request){得到:索引,則params}' 然後,在其他參數合併的上下文塊下。當我在測試中傳遞這些參數時,它們是整數。如果我不通過參數傳遞格式(如上所述),控制器將它們解析爲字符串。如果我添加格式說明符,它們被解析爲整數。 – 2014-11-24 16:12:03

0

請簽出以下初始化: https://github.com/rails/rails/blob/756baf296b3cb3f7bc40d5843e259276695071ab/actionpack/lib/action_dispatch/http/response.rb#L113

這是他們如何查找頁眉內容類型爲設置。

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