Node.js使用JSONP接口的具體用法
1. 概念及特點(diǎn)
概念:瀏覽器通過(guò) <script> 標(biāo)簽的 src 屬性,請(qǐng)求服務(wù)器上的數(shù)據(jù),同時(shí)服務(wù)器返回一個(gè)函數(shù)的調(diào)用。這種請(qǐng)求數(shù)據(jù)的方式叫做 JSONP
特點(diǎn): ① JSONP 不屬于真正的 Ajax 請(qǐng)求,因?yàn)樗鼪](méi)有使用 XMLHttpRequest 這個(gè)對(duì)象
② JSONP 僅支持 GET 請(qǐng)求,不支持 POST、PUT、DELETE 等請(qǐng)求
2. 創(chuàng)建 JSONP 接口的注意事項(xiàng)
如果項(xiàng)目中已經(jīng)配置了 CORS 跨域資源共享,為了防止沖突,必須在配置 CORS 中間件之前聲明 JSONP 的接口。否者 JSONP 接口會(huì)被處理成開(kāi)啟了 CORS 的接口
// 優(yōu)先創(chuàng)建 JSONP 接口 [這個(gè)接口不會(huì)被處理成 CORS 接口]
app.get('/api/jsonp', (req, res) => { })
// 配置 CORS 中間件 [后續(xù)的所有接口都會(huì)被處理成 CORS 接口]
app.use(cors())
// 這是一個(gè)開(kāi)啟了 CORS 的接口
app.get('/api/get', (req, res) => { })
3. 實(shí)現(xiàn) JSONP 接口的步驟
① 獲取客戶端發(fā)送過(guò)來(lái)的回調(diào)函數(shù)的名字
② 得到要通過(guò) JSONP 形式發(fā)送給客戶端的數(shù)據(jù)
③ 根據(jù)前兩步得到的數(shù)據(jù),拼接出一個(gè)函數(shù)調(diào)用的字符串
④ 把上一步拼接得到的字符串,響應(yīng)給客戶端的 <script> 標(biāo)簽進(jìn)行解析執(zhí)行
4. 實(shí)現(xiàn) JSONP 接口的具體代碼
app.get('/api/jsonp', (req, res) => {
// 1.
const funName = req.query.callback
// 2.
const data = { name: 'zj', age: '22' }
// 3.
const scriptStr = `${funName}(${JSON.stringify(data)})`
// 4.
res.send(scriptStr)
})5. 在網(wǎng)頁(yè)中使用 JQuery 發(fā)起 JSONP 請(qǐng)求
調(diào)用 $.ajax()函數(shù),提供 JSONP 的配置選項(xiàng),從而發(fā)起 JSONP 請(qǐng)求
$('#btnJSONP').on('click', () => {
$.ajax({
method: 'GET',
url: 'http://127.0.0.1/api/jsonp',
dataType: 'jsonp', // 表示要發(fā)起的是 JSONP 請(qǐng)求
success: (res) => {
console.log(res)
}
})
})使用JSONP格式實(shí)現(xiàn)跨域
實(shí)現(xiàn)步驟
- 動(dòng)態(tài)創(chuàng)建一個(gè)script標(biāo)簽
- src指向接口的地址
- 定義一個(gè)函數(shù)和后端調(diào)用的函數(shù)名一樣
實(shí)現(xiàn)代碼 -- 在nodejs中使用http內(nèi)置模塊起一個(gè)服務(wù),端口號(hào)為3000
const url = require('url')
const http = require('http')
const server = http.createServer((req,res)=>{
if(req.url === '/favicon.ico') return //圖標(biāo)忽略 --- 圖標(biāo)地址也會(huì)請(qǐng)求后臺(tái)服務(wù)
const {query,pathname} = url.parse(req.url,true) //若加上true這個(gè)參數(shù),query字符串參數(shù)會(huì)自動(dòng)轉(zhuǎn)成對(duì)象格式
//設(shè)置頭部信息 狀態(tài)為200 內(nèi)容為JSON格式 如果要返回html片段這設(shè)置為text/html
res.writeHead(200, { 'Content-Type': 'application/json' });
if(pathname == '/api/data'){
//定義對(duì)象,返回給前端的 數(shù)據(jù)
const obj = {code:200,message:'jsonp形式返回給前端'}
//返回一個(gè)JSON調(diào)用的函數(shù)
res.end(`toFront(${JSON.stringify(obj)})`)
}else{
//簡(jiǎn)單處理了
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end('404')
}
//jsonp跨域操作
// console.log(req.url) //獲取請(qǐng)求除域名外的地址 例如 localhost:300/api 只獲取/api
})
server.listen(3000,()=>{
console.log("服務(wù)已啟動(dòng)")
})在客戶端的代碼
<script type="text/javascript">
//jsonp跨域步驟
//1.動(dòng)態(tài)創(chuàng)建一個(gè)script標(biāo)簽
const newscript = document.createElement('script')
//2.src指向接口的地址
newscript.src = 'http://localhost:3000/api/data'
document.body.appendChild(newscript )
//3.定義一個(gè)函數(shù)和后端調(diào)用的函數(shù)名一樣
function toFront(res){
//后臺(tái)返回的數(shù)據(jù) 這個(gè)函數(shù)是后臺(tái)服務(wù)調(diào)用過(guò)來(lái)的
console.log(res)
}
</script>執(zhí)行的結(jié)果 ,返回一個(gè)JSON格式的文檔

到此這篇關(guān)于Node.js使用JSONP接口的具體用法的文章就介紹到這了,更多相關(guān)Node.js JSONP接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nodejs環(huán)境實(shí)現(xiàn)socket通信過(guò)程解析
這篇文章主要介紹了Nodejs環(huán)境實(shí)現(xiàn)socket通信過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
前端如何更好的展示后端返回的十萬(wàn)條數(shù)據(jù)
這篇文章主要為大家介紹了前端如何更好的展示后端返回的十萬(wàn)條數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
NPM相關(guān)命令之報(bào)錯(cuò)node-gyp...的解決方法
node-gyp就是為node編譯c++擴(kuò)展的時(shí)候使用的編譯工具,下面這篇文章主要給大家介紹了關(guān)于NPM相關(guān)命令之報(bào)錯(cuò)node-gyp...的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
node.js中的path.dirname方法使用說(shuō)明
這篇文章主要介紹了node.js中的path.dirname方法使用說(shuō)明,本文介紹了path.dirname的方法說(shuō)明、語(yǔ)法、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
node中npm ERR! network ‘proxy‘ 配置問(wèn)題解決
在進(jìn)行npm依賴管理時(shí),可能會(huì)遇到因網(wǎng)絡(luò)配置不當(dāng)導(dǎo)致的錯(cuò)誤,如npm ERR! network proxy config is set properly,下面就來(lái)介紹一下,感興趣的可以了解一下2024-09-09
輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn),本文先是組出了代碼,然后對(duì)代碼一一分析,需要的朋友可以參考下2014-12-12
Node.js操作MySQL8.0數(shù)據(jù)庫(kù)無(wú)法連接的問(wèn)題解決
使用node.js連接數(shù)據(jù)庫(kù)MySQL 8時(shí)候,顯示報(bào)錯(cuò) ER_NOT_SUPPORTED_AUTH_MODE,本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2023-10-10
node連接mysql查詢事務(wù)處理的實(shí)現(xiàn)
本文主要介紹了node連接mysql查詢事務(wù)處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

