為什麼jsonp只能使用get請求,是因為get的一些原因,還是post的某些原因,還是一些別的原因,我查文檔說是'這是由於該技術本身的特性所決定的' 請問這種本身的特性是指的什麼,能不能具體的說明一下。萬分感謝!
闭关修行中......
JSONP 是一種【請求一段 JS 腳本,把執行這段腳本的結果當作資料】的玩法。
所以,你能 POST 一段透過 script 標籤引入的腳本嗎?
(如果看過 JSONP 函式庫的原始碼就知道,常見的實作程式碼其實就是 document.createElement('script') 產生一個 script 標籤,然後插 body 裡而已。這裡根本沒有設定請求格式的餘地)。
document.createElement('script')
域名A中的JS代碼AJAX請求域名為B的伺服器數據,這就是跨域AJAX請求,預設情況下是不行的。
但是HTML中有地方可以跨域請求,例如img script標籤,它們的src屬性指向的位址可以是不在網域名稱下的(即跨域)。
那有人就利用了上面的特點,選擇了script中src能夠跨域獲得內容的特性,研究出了JSONP這種hack協議。 (src中請求都是GET)
那假設JSONP請求如下:
jsonp({ url: 'http://path/to/server/b', params: {A: a, B: b}, success: function myCallback (response) {} })
背後其實在進行:
拼接一個script標籤,,從而觸發對指定位址的GET請求
那伺服器端對這個GET請求進行處理,並回傳字串 "myCallback('response value')"
那前端script載入完之後,其實就是在script中執行myCallback('response value')
myCallback('response value')
是不是就完成了跨域的請求,
是不是就是只能用GET
類似於給你的頁裡面動態加了一段js 程式碼,你覺得js檔案可以post嗎?
假設你要求的地址傳回這麼個網頁.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="jquery.min.js"></script> </head> <body> </body> </html>
瀏覽器拿到這個網頁後要解析, 解析到
<script src="jquery.min.js"></script>
這一行程式碼的時候, 就知道這裡需要一個js檔, 於是再發起一個請求, 去拿這個js檔. 這個請求只能用GET方法, 不可能是POST, 就好像你在瀏覽器地址欄輸入地址回車進入一樣.
JSONP的實現原理就是創建一個script標籤, 再把需要請求的api地址放到src裡. 所以只能是GET的.
因為
JSONP 是一種
【請求一段 JS 腳本,把執行這段腳本的結果當作資料】
的玩法。
所以,你能 POST 一段透過 script 標籤引入的腳本嗎?
(如果看過 JSONP 函式庫的原始碼就知道,常見的實作程式碼其實就是
document.createElement('script')
產生一個 script 標籤,然後插 body 裡而已。這裡根本沒有設定請求格式的餘地)。域名A中的JS代碼AJAX請求域名為B的伺服器數據,這就是跨域AJAX請求,預設情況下是不行的。
但是HTML中有地方可以跨域請求,例如img script標籤,它們的src屬性指向的位址可以是不在網域名稱下的(即跨域)。
那有人就利用了上面的特點,選擇了script中src能夠跨域獲得內容的特性,研究出了JSONP這種hack協議。 (src中請求都是GET)
那假設JSONP請求如下:
背後其實在進行:
拼接一個script標籤,
,從而觸發對指定位址的GET請求
那伺服器端對這個GET請求進行處理,並回傳字串 "myCallback('response value')"
那前端script載入完之後,其實就是在script中執行
myCallback('response value')
是不是就完成了跨域的請求,
是不是就是只能用GET
類似於給你的頁裡面動態加了一段js 程式碼,你覺得js檔案可以post嗎?
假設你要求的地址傳回這麼個網頁.
瀏覽器拿到這個網頁後要解析, 解析到
這一行程式碼的時候, 就知道這裡需要一個js檔, 於是再發起一個請求, 去拿這個js檔. 這個請求只能用GET方法, 不可能是POST, 就好像你在瀏覽器地址欄輸入地址回車進入一樣.
JSONP的實現原理就是創建一個script標籤, 再把需要請求的api地址放到src裡. 所以只能是GET的.
因為