[練習] JSONP 實作


Posted by ianchen6501 on 2021-02-26

為什麼需要 JSONP

要談 JSONP ,首要先了解假如今天我們用 AJAX、Fetch、XMLHTTPRequest 等方式對一個非同源的對象發出請求時,會建立一個跨來源請求(CORS),而瀏覽器就會根據同源政策(same-origin Policy),假若請求的對象非屬同源對象(相同 protocol / domain / port),就會檢查回傳的內容是否有 CORS Header,如果沒有的話我們就無法檢視回傳的內容。
為了解決同源政策造成的傳輸問題,JSONP 就是因應而生的一個解決方式。

JSONP 原理

如同前面所說,並不是每一種請求都會受到同源政策的限制,例如在瀏覽網頁的時候常會需要載入許多靜態檔案(如 img / css...),這些透過 <script src="..."> 發出請求的方式,就不會受到同源政策的限制,那我們就可以利用這個特性來傳輸資料。

實作 JSONP (利用 script tag)

首先我們利用動態產生的 script src 來發出一個跨域請求,同時帶上一個 callback query string,這個 callback function 必須在前端先建立好。

  function getUser() { //動態產生 script header
    const script = document.createElement("script")
    script.src = "http://localhost:5003?callback=setUser" //請求對象
    document.body.appendChild(script)
  }
  function setUser(response) { //callback function
    ...
  }

JSONP 另外需要遠端伺服器搭配回傳一段 JSON 格式的資料,資料內容必須依據 query string 的內容來包裝,才可以在前端觸發 callback function。

app.get("/",(req, res) => {
  const callback = req.query.callback
  const userData = {
    name: "小明"
  }
  res.send(`${callback}(${JSON.stringify(userData)})`) //這邊要用 JSON 傳送
  res.end()
})

這樣我們就簡易的建立了個 JSONP 的實例。

reference

跨來源資源共用(CORS)
CORS 完全手冊(二):如何解決 CORS 問題?


##JSONP #CORS







Related Posts

國際電匯疑難雜症 || 國泰世華網銀

國際電匯疑難雜症 || 國泰世華網銀

API 串接的新手探險之旅 -- week 4 hw 1

API 串接的新手探險之旅 -- week 4 hw 1

Day00

Day00


Comments