為了解決跨域問題,開發者創造出一種非官方跨域資料互動協議——jsonp。
script:src 不受跨域限制。如下例子:即便在本地使用該標籤,也能有效訪問
jsonp實現原理src=
"">
script
>
我們自己先建立乙個函式,請求成功並獲取到伺服器傳送的相應後,這個函式會被呼叫,注意,這個函式必須在 window 上。
利用 script 標籤訪問介面,此時我們需要將之前建立的那個函式名作為引數傳過去,引數名需要與後端約定好,一般來說我們約定成俗都會使用 callback,如下>
window.
jsonpresponse
=function
(res)
script
>
此時,我們將收到伺服器的響應:>
window.
jsonpresponse
=function
(res)
script
>
src=
"">
script
>
觀察上面的資料,我們發現伺服器給我們的資料實際上就是乙個函式呼叫,而函式名就是我們之前傳入的 callback 引數值 : jsonpresponse。另外,通過script標籤訪問位址,傳送的其實是乙個js請求,如下圖所示jsonpresponse
()
結合以上例子的論證,不難明白,jsonp 請求實際上就是利用 script 標籤向伺服器傳乙個函式名。伺服器拼接乙個函式呼叫的字串傳回客戶端
自己封裝乙個 jsonp 請求
前端:
後端(nodejs):let jsonpcount =
0function
jsonp
(url, params)=$
` })}
p = url.
match
(/\?/)?
`&callback=__jp$$
` :`?callback=__jp$$
` const body = document.body
const script = document.
createelement
('script'
) script.
setattribute
('src'
, url + p)
body.
insertbefore
(script, body.children[0]
) window[
`__jp$`
]= res =>})
}
const express =
require
('express'
)express()
get(
'/',
(req, res)
=>
// 拼接函式
const func= fnname +
'('+
json
.stringify
(resdata)
+')'
res.
send
(func)
})
JSONP跨域請求
看到jsonp我們會很自然的想到json,但它們卻有很大的不同,json是一種輕量級的資料交換格式,而jsonp可以說是一種非官方的資料互動協議。jsonp json with padding 利用jsonp可以從別的網域名稱下獲取資料,即跨域獲取資料。由於同源策略不允許xmlhttprequest...
JSONP跨域請求
前端常用ajax請求來實現不重新整理頁面方式向伺服器請求資料,但它受瀏覽器同源策略的影響而無法實現跨域請求。然而script標籤src屬性的引用卻是不受跨越限制的,基於此可以傳送跨域請求,服務端不再是返回json格式的資料,而是返回一段呼叫某個函式的js 在src中進行了呼叫。您所在的城市天氣情況 ...
jsonp跨域請求
ajax是不能跨域的,但是利用jsonp是可以實現跨域的,博主今天記錄一篇jsonp跨域的例項。通俗的說,就是利用的特殊性去請求伺服器,伺服器返回josnp格式資料,jsonp資料格式 function json 換句話說,就是把json資料報裝在乙個函式引數中返回,然後呼叫本地js中的functi...