JSONP 不支援 POST 方法的核心原因在於它的實現機制。JSONP(JSON with Padding)本質上是一種利用 <script>
標籤繞過瀏覽器同源策略來實現跨域資料獲取的技術。
以下是具體解釋:
-
<script>
標籤的限制: JSONP 的核心是動態建立<script>
標籤,並將目標 URL 作為其src
屬性值。<script>
標籤天生就只支援 GET 請求,它會向指定的 URL 傳送一個 GET 請求來獲取 JavaScript 程式碼。 無法使用<script>
標籤傳送 POST 請求。 -
同源策略的繞過: 瀏覽器同源策略限制了從一個源載入的文件或指令碼如何與來自另一個源的資源進行互動。 這是一種關鍵的安全機制,旨在防止惡意網站竊取資料。 JSONP 利用了
<script>
標籤不受同源策略限制的特點。伺服器端會將資料包裝在一個預先定義好的 JavaScript 回撥函式中,然後瀏覽器在接收到響應後會執行該回撥函式,從而實現跨域資料傳遞。 這個過程只能透過 GET 請求完成,因為這是<script>
標籤的工作方式。 -
POST 請求的特性: POST 請求通常用於向伺服器提交資料,並且資料包含在請求體中。
<script>
標籤的src
屬性只能指定 URL,無法設定請求體,因此無法透過<script>
標籤傳送包含資料的 POST 請求。 -
CORS 的出現: 跨域資源共享 (CORS) 是一種更現代、更安全、更靈活的跨域解決方案。CORS 允許伺服器明確指定哪些來源可以訪問其資源,以及允許使用哪些 HTTP 方法(包括 GET、POST、PUT、DELETE 等)。 由於 CORS 的出現,JSONP 的使用場景已經大大減少。 如果需要跨域傳送 POST 請求,CORS 是更好的選擇。
總結:JSONP 的設計初衷就是利用 <script>
標籤的特性來繞過同源策略,而 <script>
標籤只支援 GET 請求,因此 JSONP 無法支援 POST 方法。 在現代 Web 開發中,應該優先考慮使用 CORS 來解決跨域問題,而不是使用 JSONP。