簡體   English   中英

Spring 4 @RequestMapping - 使用vs頭文件?

[英]Spring 4 @RequestMapping — consumes vs headers?

我正在學習如何使用Spring 4構建RESTful Web服務,有一點我不清楚是在@RequestMapping中。 我見過一些例子,其中一個使用headers = "Accept=application/xml" ,其他例子使用consume(或產生) = "application/xml"

例如,在我自己的@RestController類中,我有這個功能......

// POST
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/xml")
public User create(@RequestBody User user) {
    LOG.info("User = " + user.toString());
return userService.create(user);
}

使用headers = "Accept=application/xml"與使用consumes = "application/xml"?之間有什么區別= "application/xml"? 甚至使用headers = "content-type=application/xml"

有人可以解釋標題和消耗/產生之間的差異,以及何時使用它們?

簡短的回答
在上面的示例中,使用headers = "Accept=application/xml"produces = "application/xml"將以相同的方式響應客戶端,即使用XML表示向客戶端發送響應。

更長的答案
一世。
對於RESTful Web服務,客戶端(例如您的瀏覽器)向服務器發送請求(例如GET,POST等),服務器將發回響應。 這是一個HTTP事務。 請求和響應都有HTTP頭字段(“標題”),它定義HTTP事務的操作參數(我將客戶端請求的頭稱為“請求頭”,這些與服務器響應的頭不同“響應頭“)。

作為您的瀏覽器發送到服務器的請求的一部分,有不同的請求標頭,一些示例包括AcceptConnectionContent-Length等,每個標頭都有自己的功能(請參閱完整的標題列表: https:/ /en.wikipedia.org/wiki/List_of_HTTP_header_fields )。

使用您的代碼示例,如果客戶端發出POST請求,Spring將檢查請求標頭,如果它找到帶有application/xml值的標頭Accept ,它會將請求映射到您上面的create方法(在您的情況下,服務器將向客戶端返回XML響應表示。

讓我修改您提供的代碼中的headers元素:

@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive")
public User create(@RequestBody User user) {
 ...
}

請注意, headers元素現在具有Connection=keep-alive 如果客戶端發出POST請求,Spring將檢查請求標頭,如果它找到一個值為keep-alive的標頭Connection ,它會將該客戶端請求映射到上面的create方法。

II。 生產和消費
如果對create方法使用了produces="application/xml" ,則這意味着如果客戶端的Accept標頭與application/xml匹配,則客戶端請求僅映射到create方法。 這本質上是客戶說,“嘿服務器,我更喜歡接受你的XML表示響應,所以用XML發送你的回復”。 有效地,produce produces="application/xml"也是服務器說“嘿客戶端,我只能用XML表示為你生成響應,所以我會發給你那個格式”。 鏈接到Spring文檔參考

如果對create方法使用了consumes="application/xml" ,則表示如果客戶端的Content-Type標頭與application/xml匹配,則客戶端請求僅映射到create方法( Content-Type請求標頭描述客戶端的表示形式)要求即將到來)。 這本質上是服務器說,“嘿客戶端,我只能使用XML表示消費請求,所以將該格式發送給我”。

摘要
@RequestMapping注釋中的headers元素可以使用不同的請求頭( AcceptConnectionCache-Control等),但produces元素僅涉及Accept請求頭,而consumes元素僅與Content-Type請求有關。頭。

作為HeadersRequestCondition的javadoc(它處理@RequestMapping注釋的headers屬性中提供的值)狀態

傳遞給構造函數的表達式名稱為“Accept”或“Content-Type”將被忽略。 請參閱ConsumesRequestConditionProducesRequestCondition

所以不要在headers使用這些headers 使用AcceptContent-Typeproducesconsumes屬性。

至於如何使用它們,文檔給出了例子: consumesproduces

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM