(快速參考)

withFormat

目的

根據傳入請求的 Accept 標頭、格式參數或 URI 副檔名,呈現不同的回應。請參閱 內容協商 以取得更多資訊。

範例

import grails.converters.XML

class BookController {

    def list() {
        def books = Book.list()

        withFormat {
            html bookList:books
            js { render "alert('hello')" }
            xml { render books as XML }
        }
    }
}

說明

withFormat 接受一個 Closure,其中包含與您想要回應的不同內容類型對應的方法。例如

withFormat {
    html bookList: books
    js { render "alert('hello')" }
    xml { render books as XML }
}

在此,我們呼叫三個方法,分別稱為 htmljsxml,這些方法使用在 grails-app/conf/application.yml 中設定的 MIME 類型名稱(請參閱 內容協商 以取得更多資訊)。呼叫 html 會接受一個模型(一個 Map),並傳遞給檢視。Grails 會搜尋一個稱為 grails-app/views/book/list.html.gsp 的檢視,如果找不到,就會退回到 grails-app/views/book/list.gsp

請注意,如果請求格式為「全部」或在接受標頭中有多個內容類型具有相同的「q」評級,則類型順序很重要。在前一種情況下,會執行區塊中的第一個類型處理常式(在上述簡短範例中為「html」)。後一種情況比較令人困惑,因為它僅適用於下列情況:有多個內容類型具有最高的「q」評級,而您有一個類型處理常式,而且您有多個類型處理常式符合該「q」評級。例如,如果請求具有「q」評級為 1.0 的「text/html」和「application/xml」,則此程式碼

withFormat {
    xml { ... }
    html { ... }
}

將對請求使用「xml」類型處理常式。

另一個要注意的重要因素是,withFormat 方法處理的是回應格式,而不是請求格式。從 Grails 2.0 開始,request 上提供了一個獨立的 withFormat 方法,您可以使用它來處理請求格式,而請求格式是由請求的 CONTENT_TYPE 標頭決定的

request.withFormat {
    form { .. }
    xml { .. }
    json { .. }
}
form 的請求格式用於處理內容協商中的表單提交,而不是 html

如果您需要模型被延遲執行,您可以傳遞一個 Closure 而不是一個 Map

withFormat {
    html { [bookList: Book.list()] }
    ...
}

這樣,只有在 html 格式匹配時,才會執行 html Closure。

除非您在 application.groovy 檔案中新增 grails.mime.use.accept.header = true 設定,否則 Grails 會忽略 HTTP Accept 標頭。換句話說,沒有該設定,withFormat() 將完全不受 Accept 標頭影響。