Node.js使用JSONP接口的具體用法
1. 概念及特點
概念:瀏覽器通過 <script> 標簽的 src 屬性,請求服務(wù)器上的數(shù)據(jù),同時服務(wù)器返回一個函數(shù)的調(diào)用。這種請求數(shù)據(jù)的方式叫做 JSONP
特點: ① JSONP 不屬于真正的 Ajax 請求,因為它沒有使用 XMLHttpRequest 這個對象
② JSONP 僅支持 GET 請求,不支持 POST、PUT、DELETE 等請求
2. 創(chuàng)建 JSONP 接口的注意事項
如果項目中已經(jīng)配置了 CORS 跨域資源共享,為了防止沖突,必須在配置 CORS 中間件之前聲明 JSONP 的接口。否者 JSONP 接口會被處理成開啟了 CORS 的接口
// 優(yōu)先創(chuàng)建 JSONP 接口 [這個接口不會被處理成 CORS 接口] app.get('/api/jsonp', (req, res) => { }) // 配置 CORS 中間件 [后續(xù)的所有接口都會被處理成 CORS 接口] app.use(cors()) // 這是一個開啟了 CORS 的接口 app.get('/api/get', (req, res) => { })
3. 實現(xiàn) JSONP 接口的步驟
① 獲取客戶端發(fā)送過來的回調(diào)函數(shù)的名字
② 得到要通過 JSONP 形式發(fā)送給客戶端的數(shù)據(jù)
③ 根據(jù)前兩步得到的數(shù)據(jù),拼接出一個函數(shù)調(diào)用的字符串
④ 把上一步拼接得到的字符串,響應(yīng)給客戶端的 <script> 標簽進行解析執(zhí)行
4. 實現(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)頁中使用 JQuery 發(fā)起 JSONP 請求
調(diào)用 $.ajax()函數(shù),提供 JSONP 的配置選項,從而發(fā)起 JSONP 請求
$('#btnJSONP').on('click', () => { $.ajax({ method: 'GET', url: 'http://127.0.0.1/api/jsonp', dataType: 'jsonp', // 表示要發(fā)起的是 JSONP 請求 success: (res) => { console.log(res) } }) })
使用JSONP格式實現(xiàn)跨域
實現(xiàn)步驟
- 動態(tài)創(chuàng)建一個script標簽
- src指向接口的地址
- 定義一個函數(shù)和后端調(diào)用的函數(shù)名一樣
實現(xiàn)代碼 -- 在nodejs中使用http內(nèi)置模塊起一個服務(wù),端口號為3000
const url = require('url') const http = require('http') const server = http.createServer((req,res)=>{ if(req.url === '/favicon.ico') return //圖標忽略 --- 圖標地址也會請求后臺服務(wù) const {query,pathname} = url.parse(req.url,true) //若加上true這個參數(shù),query字符串參數(shù)會自動轉(zhuǎn)成對象格式 //設(shè)置頭部信息 狀態(tài)為200 內(nèi)容為JSON格式 如果要返回html片段這設(shè)置為text/html res.writeHead(200, { 'Content-Type': 'application/json' }); if(pathname == '/api/data'){ //定義對象,返回給前端的 數(shù)據(jù) const obj = {code:200,message:'jsonp形式返回給前端'} //返回一個JSON調(diào)用的函數(shù) res.end(`toFront(${JSON.stringify(obj)})`) }else{ //簡單處理了 res.writeHead(404, { 'Content-Type': 'application/json' }); res.end('404') } //jsonp跨域操作 // console.log(req.url) //獲取請求除域名外的地址 例如 localhost:300/api 只獲取/api }) server.listen(3000,()=>{ console.log("服務(wù)已啟動") })
在客戶端的代碼
<script type="text/javascript"> //jsonp跨域步驟 //1.動態(tài)創(chuàng)建一個script標簽 const newscript = document.createElement('script') //2.src指向接口的地址 newscript.src = 'http://localhost:3000/api/data' document.body.appendChild(newscript ) //3.定義一個函數(shù)和后端調(diào)用的函數(shù)名一樣 function toFront(res){ //后臺返回的數(shù)據(jù) 這個函數(shù)是后臺服務(wù)調(diào)用過來的 console.log(res) } </script>
執(zhí)行的結(jié)果 ,返回一個JSON格式的文檔
到此這篇關(guān)于Node.js使用JSONP接口的具體用法的文章就介紹到這了,更多相關(guān)Node.js JSONP接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
better?sqlite3安裝node?gyp原生模塊編譯prebuild-install
這篇文章主要為大家介紹了Nodejs關(guān)于原生模塊編譯node-gyp?+?prebuild-install?(以安裝?better-sqlite3為例)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11用nodejs實現(xiàn)json和jsonp服務(wù)的方法
本篇文章主要介紹了用nodejs實現(xiàn)json和jsonp服務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08socket.io與pm2(cluster)集群搭配的解決方案
這篇文章主要給大家介紹了關(guān)于socket.io與pm2(cluster)集群搭配的解決方案,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來看看吧。2017-06-06node.js連接mongoDB數(shù)據(jù)庫 快速搭建自己的web服務(wù)
這篇文章主要為大家詳細介紹了node.js連接mongoDB數(shù)據(jù)庫,如何快速搭建自己的web服務(wù),感興趣的小伙伴們可以參考一下2016-04-04Nodejs連接mysql并實現(xiàn)增、刪、改、查操作的方法詳解
這篇文章主要介紹了Nodejs連接mysql并實現(xiàn)增、刪、改、查操作的方法,結(jié)合實例形式詳細分析了nodejs針對mysql數(shù)據(jù)庫的的連接、mysql數(shù)據(jù)庫的創(chuàng)建及nodejs針對mysql增刪改查等相關(guān)操作具體實現(xiàn)技巧,需要的朋友可以參考下2018-01-01