jQuery Ajax中參數data傳入string類型,請求數據多一個冒號的分析

問題發生環境

在使用jQuery的ajax函數時候,data傳入一個字符串,但是請求的數據後尾出現了一個冒號(:),但是傳入object類型調用請求正常。

請求截圖:
這裏寫圖片描述
ajax方法截圖:
這裏寫圖片描述
調試截圖:
這裏寫圖片描述
傳入object類型調用截圖
這裏寫圖片描述

問題分析

1、爲什麼會出現冒號情況
因爲使用的是谷歌瀏覽器(Chrome),在開發者工具的From Data中查看有兩個模式:

  1. view parsed(解析視圖),出現冒號
    這裏寫圖片描述
  2. view source(查看源代碼),沒有冒號
    這裏寫圖片描述

2、爲什麼視圖解析會將字符解析成鍵值對
這個還要從jQuery的ajax方法說起,其中影響的是兩個參數:

1、data參數,會默認轉換成鍵值對形式,但是字符在形式中不轉換。發現在解析視圖中還是被解析的,可是查看源代碼模式是沒有實際添加的冒號。這說明只是顯示的情況下看到,但是實際傳輸確實沒有的。

data
類型: PlainObject 或 String 或 Array
發送到服務器的數據。它被轉換成一個查詢字符串,如果已經是一個字符串的話就不會轉換。查詢字符串將被追加到GET請求的URL後面。參見 processData 選項說明,以防止這種自動轉換。對象必須爲”{鍵:值}”格式。如果這個參數是一個數組,jQuery會按照traditional 參數的值, 將自動轉化爲一個同名的多值查詢字符串(查看下面的說明)。愚人碼頭注:如 {foo:[“bar1”, “bar2”]} 轉換爲 ‘&foo=bar1&foo=bar2’。(感謝 @AL0n4k提供的翻譯建議。)

2、contentType 參數,因爲默認application/x-www-form-urlencoded: 窗體數據被編碼爲名稱/值對。這是標準的編碼格式。所以被將被解析視圖所解析。

contentType (default: ‘application/x-www-form-urlencoded; charset=UTF-8’)
Type: Boolean or String
當將數據發送到服務器時,使用該內容類型。默認值是”application/x-www-form-urlencoded; charset=UTF-8”,適合大多數情況。如果你明確地傳遞了一個內容類型(Content-Type)給 $.ajax(),那麼他總是會發送給服務器(即使沒有數據要發送)。從 jQuery 1.6 開始,你可以傳遞false來告訴jQuery,沒有設置任何內容類型頭信息。 注意:W3C的XMLHttpRequest的規範規定,數據將總是使用UTF-8字符集傳遞給服務器;指定其他字符集無法強制瀏覽器更改編碼。 注意:對於跨域請求,內容類型設置爲application/x-www-form-urlencoded, multipart/form-data, 或 text/plain以外, 將觸發瀏覽器發送一個預檢OPTIONS請求到服務器。

3、爲什麼請求狀態碼是415
這是因爲我弄錯了接口所允許的Content-type,不允許application/x-www-form-urlencoded,應該是application/json,所以這是我自己程序的問題。。。

對於當前請求的方法和所請求的資源,請求中提交的實體並不是服務器中所支持的格式,因此請求被拒絕。

結論

1、這個冒號的出現是因爲contentType的默認是application/x-www-form-urlencoded,所以它將被解析成鍵值對展示,但是字符串進去是沒有改變的,但是展示的時候能看見。
2、要避免這個問題就需要將contentType改爲application/json。當然修改了這個參數你的後臺接口程序必須支持這個請求類型。
3、對於跨域請求,當contentType改爲application/json,將觸發瀏覽器發送一個預檢OPTIONS請求到服務器。而這個請求後臺接口必須支持。
4、這個是個人對於這個問題的一點個人看法,要是有什麼問題請在下方留言,共同進步,十分感謝~

參考文獻

1、jQuery API 中文文檔
2、開源中國-HTTP狀態碼詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章