前言
以前一直以為當$.ajax()
的 dataType設置為jsonp時,其method(請求方法)無論怎么設置,都會變成get,直到前兩天遇到了一個坑。
下面來一起看看詳細的介紹:
關於跨域請求與jsonp
- 跨域:由於受到同源策略(協議、域名、端口三者必須全部相同)的影響,ajax請求會受到限制,要突破這種限制,跨域便產生了。跨域的解決方案有多種,這里不展開闡述,只是針對GET請求中的jsonp跨域解決方案做一下說明。
- jsonp,本質上jsonp不是xhr異步請求,就是請求了一個js文件,因此在chrome的network面板中的xhr標簽下看不到jsonp的跨域請求,在js標簽下能看到。就是利用script標簽中src不受同源策略的限制,前端定義了回調函數,請求的js腳本中獲取數據,並執行前端的回調函數,因此前后端需要統一定義下回調函數名。
$.ajax
中jsonp,$.ajax
對jsonp進行了封裝看起來像是ajax請求。由於jsonp是針對get請求的跨域解決,因此之前的經驗告訴我,即使type設置了post,在jsonp的時候,也會自動轉換成get,直到有一天踩了個坑。翻看$.ajax模塊的源碼發現,只有去手動設置crossDomain為true,或者實際上是跨域,才會設置為get。否則還是填入的type
結論:
手動設置crossDomain為true,或者真的是跨域,才會修改type為GET,否則還是傳入的type參數