1. 程式人生 > 實用技巧 >Content-Type /AJAX /@ResponseBody

Content-Type /AJAX /@ResponseBody

Content-Type

Content-Type(內容型別),(Mime-Type)一般是指網頁中存在的 Content-Type,用於定義網路檔案的型別和網頁的編碼,決定瀏覽器將以什麼形式、什麼編碼讀取這個檔案。用於指示資源的MIME型別,如果未指定 ContentType,預設為text/html 有兩種場景: 在請求中 (如POST 或 PUT),客戶端告訴伺服器實際傳送的資料型別。

在request請求中是告訴伺服器傳送給伺服器的內容型別。在response請求中是伺服器告訴瀏覽器傳輸過來的是什麼型別,瀏覽器根據該型別來決定怎麼解析發過來的資源。

引數一般media-type、charset、boundary三種。 我們的關注點在於media-type的取值以及其適用場景。

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

一個MIME型別至少包括兩個部分:一個型別(type)和一個子型別(subtype)

MIME型別

  • text/html : HTML格式
  • text/plain :純文字格式
  • text/xml : XML格式
  • image/gif :gif圖片格式
  • image/jpeg :jpg圖片格式
  • image/png:png圖片格式

以application開頭的媒體格式型別:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML資料格式
  • application/atom+xml :Atom XML聚合格式
  • application/json: JSON資料格式
  • application/pdf:pdf格式
  • application/msword : Word文件格式
  • application/octet-stream : 二進位制流資料(如常見的檔案下載)
  • application/x-www-form-urlencoded : <form encType="">中預設的encType,form表單資料被編碼為key/value格式傳送到伺服器(表單預設的提交資料的格式)

另外一種常見的媒體格式是上傳檔案之時使用的:

  • multipart/form-data : 需要在表單中進行檔案上傳時,就需要使用該格式

application/json

隨著json這種輕量級的資料互動格式的流行,特別是和指令碼互動的便利,使得在前後介面中,越來越多采用json格式。對於http協議來說,最終傳輸的還是字元。這裡不再多進行描述。

{name: "John", age: 31, city: "New York"};

application/x-www-form-urlencoded 作為表單提交中預設的型別,其表明資料以標準的編碼格式被編碼為鍵值對。 資料被編碼成以 '&' 分隔的鍵-值對, 同時以 '=' 分隔鍵和值. 非字母或數字的字元會被 percent-encoding: 這也就是為什麼這種型別不支援二進位制資料的原因 (應使用 multipart/form-data 代替)。引數中的中文都被url編碼成了支援的字元

multipart/form-data 這裡為了對比,就也放到這裡來說了。
一般用於涉及檔案的表單提交,用於post請求,其格式如下

Content-Type: multipart/form-data; boundary=aBoundaryString

其中boundary指明瞭請求體中每部分的分割符(對於multipart的類目,都會存在該欄位,以區分請求體中資料的分割),其請求體中則是對應表單每部分的內容。每部分都會有自己的請求體和相關內容。multipart可以上傳多個不同的contentType的檔案,一個請求頭對應多個請求體
例如如下的文件結構:

正如上文所述,multipart一般對應單個訊息頭對應多個訊息體。 常見語法如下:

Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p

其中boundary欄位是必須的,用於區分訊息體中的資料邊界,一般是兩個'-'的格式作為該端的開頭,例如:

--gc0p4Jq0M2Yt08jU534c0p

JQuery中的Ajax請求的引數

data

型別: [Object, String](https://www.jquery123.com/Types/#Object, String)

傳送到伺服器的資料。將自動轉換為請求字串格式。GET 請求中將附加在 URL 後面。檢視 processData 選項說明,以禁止此自動轉換。物件必須為"{鍵:值}"格式。如果這個引數是一個數組,jQuery會按照traditional 引數的值, 將自動轉化為一個同名的多值查詢字串(檢視下面的說明)。注:如 {foo:["bar1", "bar2"]} 轉換為 '&foo=bar1&foo=bar2'。

processData (預設: true)

型別: Boolean

預設情況下,通過data選項傳遞進來的資料,如果是一個物件(技術上講只要不是字串),都會處理轉化成一個查詢字串,以配合預設內容型別 "application/x-www-form-urlencoded"。如果要傳送 DOM 樹資訊或其它不希望轉換的資訊,請設定為 false

dataType (預設: Intelligent Guess (xml, json, script, or html))

型別: String

預期伺服器返回的資料型別。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊來智慧判斷,比如XML MIME型別就被識別為XML。在1.4中,JSON就會生成一個JavaScript物件,而script則會執行這個指令碼。隨後伺服器端返回的資料會根據這個值解析後,傳遞給回撥函式。可用值:

  • "xml": 返回 XML 文件,可用 jQuery 處理。.
  • "html": 返回純文字 HTML 資訊;包含的script標籤會在插入dom時執行。
  • "script": 把響應的結果當作 JavaScript 執行。並將其當作純文字返回。預設情況下不會通過在URL中附加查詢字串變數 "_=[TIMESTAMP]" 進行自動快取結果,除非設定了cache引數為trueNote: 在遠端請求時(不在同一個域下),所有POST請求都將轉為GET請求。(因為將使用DOM的script標籤來載入)
  • "json": 把響應的結果當作 JSON 執行,並返回一個JavaScript物件。在 jQuery 1.4 中,JSON 格式的資料以嚴格的方式解析,如果格式有錯誤,jQuery都會被拒絕並丟擲一個解析錯誤的異常。(見json.org的更多資訊,正確的JSON格式。)
  • "jsonp": 以 JSONP 的方式載入 JSON 資料塊。會自動在所請求的URL最後新增 "?callback=?"。預設情況下不會通過在URL中附加查詢字串變數 "_=[TIMESTAMP]" 進行自動快取結果,除非將 cache引數設定為true
  • "text": 返回純文字字串。

contentType (預設: 'application/x-www-form-urlencoded; charset=UTF-8')

型別: String

傳送資訊至伺服器時內容編碼型別。預設值是"application/x-www-form-urlencoded; charset=UTF-8",適合大多數情況。如果你明確地傳遞了一個內容型別(Content-Type)給 $.ajax(),那麼他必定會發送給伺服器(即使沒有資料要傳送)。資料將總是使用UTF-8字符集傳遞給伺服器;你必須在伺服器端進行適當的解碼。

ajax請求中如果不設定ContentType 預設進去urlencode 如果這時候在controller中寫了RequestBody註解,就會報錯

415

@RequestBody

https://blog.csdn.net/justry_deng/article/details/80972817

@RequestBody主要用來接收前端傳遞給後端的json字串中的資料的(請求體中的資料的);GET方式無請求體,所以使用@RequestBody接收資料時,前端不能使用GET方式提交資料,而是用POST方式進行提交。在後端的同一個接收方法裡,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多隻能有一個,而@RequestParam()可以有多個。

RequestBody 接收的是請求體裡面的資料;而RequestParam接收的是key-value裡面的引數

後端@RequestBody註解對應的類在將HTTP的輸入流(含請求體)裝配到目標類(即:@RequestBody後面的類)時,會根據json字串中的key來匹配對應實體類的屬性,如果匹配一致且json中的該key對應的值符合(或可轉換為

  • json字串中,如果value為""的話,後端對應屬性如果是String型別的,那麼接受到的就是"",如果是後端屬性的型別是Integer、Double等型別,那麼接收到的就是null。
  • json字串中,如果value為null的話,後端對應收到的就是null。
  • 如果某個引數沒有value的話,在傳json字串給後端時,要麼乾脆就不把該欄位寫到json字串中;要麼寫value時, 必須有值,"key":null "key":""都行。不能寫成"key":

如果沒有使用@RequestBody註解,那麼一個複雜物件User,需要從key-value中找和屬性名相同的key進行封裝,如果這時候瀏覽器傳過來的是一個json字串,就不能進行自動封裝,因此如果瀏覽器端傳過來的json,需要從使用@RequestBody接受。