2016-01-21 67 views
1

我一直在試圖實現一個RESTFul體系結構,但我對自定義媒體類型的好壞感到十分困惑。HATEOAS內容類型:自定義MIME類型

目前我的應用程序使用Http Link:header來傳達「鏈接」。這非常棒,我使用它的title屬性,允許服務器描述這個'行動'實際上是什麼,尤其是當提交給用戶時。

我很困惑的地方是我是否應該指定一個自定義的mime類型。例如我有一個用戶的概念。它可能與當前資源相關聯。我要舉一個例子,說我有一個拍賣品。我們可能讓用戶「看」它。因此,我將包括鏈接

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET"

在標題中。如果您有能力將該用戶從觀看中移除。

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET,DELETE"

我與此很高興,如果客戶有正確的角色,他可以刪除的關係。所以我正在定義如何處理關係。整潔的事情是,我們稱之爲「關係」資源的GET,我將客戶端重定向到用戶資源。

什麼讓我感到困惑的是是否使用自定義MIME類型。在互聯網上有兩種說法,在我看來這是一種說法。

我已經完成了一個示例,我在其中稱爲HEAD的未知網址,服務器返回Content-Type: application/vnd.myapp.user。然後,我的客戶決定它是否可以理解這種mime類型(它維護它理解的視圖資源的映射),並且會遵循它,或者說明它無法弄清楚這個鏈接結尾處的內容。

這是不好的?我必須保持特殊的MIME類型。特別奇怪的是,我非常樂意使用標準的application/user格式,但無法在任何地方找到指定的格式。

我開始認爲我應該試圖完全猜測在任何HTTP響應中呈現什麼,幾乎可能是我的RESTFul api應該只是呈現html,而不是試圖用json/xml做任何事情。

我試過搜索(甚至Roy Fieldings博客),但找不到任何描述客戶端應該如何處理這種情況的東西。

編輯:我與包括自定義類型的論點是,它可能不一定是一個'用戶'看項目,它可能是application/vnd.myapp.group。通過獲得響應,客戶端知道身體有不同的東西,所以更改爲顯示組的視圖。但是這種耦合的mime-type查看不好?

回答

1

我想說,你一定要爲所有表示具有特定的媒體類型。如果你可以找到一個標準的(html,jpeg,atom等),但是如果沒有,你應該定義一個(或多個)。

原因是:申述應該是自包含。這意味着你的客戶從某個地方獲得一個鏈接,它應該知道該如何處理它。如何顯示它,如何從那裏繼續等。例如,瀏覽器知道如何顯示文本/ html。你的客戶應該知道如何顯示/處理application/vnd.company.user。

此外,我認爲你有內容談判倒退。您不需要調用HEAD來確定服務器支持的表示形式。您可以使用「Accepts」標題告訴服務器您的客戶端在GET/POST/etc請求中支持的內容。事實上,這將是標準的做法。然後,服務器以它可以爲您接受的MIME類型提供的「最佳」表示做出響應。你不需要更多的往返。

所以,雖然鏈接你提供可以包含上下文信息,通常在「相對」屬性給出的,就像如果該鏈接指向一個「下一頁」,「上一頁」,「訂閱用戶」或'擁有者用戶'等,客戶不能假設這些鏈接下的任何表示。它知道它在語義上是一個'用戶',所以它可以填充'接受'標題和一個用戶的所有受支持的表示(application/vnd.company.user)。如果該表示只表示text/xml,則客戶端無法承擔可能會收到的任何內容或鏈接的語義。

在實踐中,您當然可以編寫任何客戶端來假設哪些表示法是在哪些鏈接/ url下進行的,並且您不必始終符合REST,但您確實可以獲得很多好處(如如果你這樣做,Roy Fielding的論文)。

另一個小點:鏈接不需要包含哪些方法可用於給定資源,這就是OPTIONS的用途。誠然,它很少實施。

+0

請參閱對我來說很奇怪的事情是,客戶端和可能是MIME類型幾乎必須指定所有可能的事情,觀看'。我舉了一個例子,說明未來可能會改變「觀看」背後的資源,例如一羣人。你說客戶端語義上知道它是一個用戶,但是它應該如何?它不應該得到MIME類型的服務器發回並處理它,而不是假設它是一個'application/vnd.app.user',如果它是一個不同的資源,也有這種關係? –

+0

如果您不想要,您不必指定鏈接指向用戶。但是,你怎麼知道首先有一個鏈接?或者它的「關係」屬性意味着什麼?重點是,你想分配返回的表示的任何語義必須通過一個MIME類型。所以你至少必須定義,有潛在的用戶鏈接,這隻能通過MIME類型來完成。否則,該消息不是獨立的。 –

0

您不必發送HTML來提供超媒體服務。有許多不同的超媒體格式比HTML更容易解析。 https://sookocheff.com/post/api/on-choosing-a-hypermedia-format/https://stackoverflow.com/a/13063069/607033

您不必使用特定於領域的MIME類型,在我看來,最好使用特定於領域的詞彙表與常規超媒體類型使用JSON-LD + Hydra或ATOM/XML +微數據/ RDFa等格式的微格式或schema.org ...根據您的喜好有很多替代方案。 https://en.wikipedia.org/wiki/Microdata_(HTML)http://microformats.org/http://schema.org/http://www.hydra-cg.com/

我不知道是否添加相同的關係,以多種方法是不錯的選擇。如果你願意的話,用鏈接標題中的不同鏈接標題發送多個鏈接:https://stackoverflow.com/a/25416118/607033