CORS 筆記
嗯,我要串接 xkcd 的 API,但要命<span hidden>,這 API 伺服器好像沒有給到我需要的東西這真要了我的命……</span>…我花了好幾小時在處理 CORS 問題……
總之,我沒辦法串接 xkcd 的 API 了。真可惜,不過講點 CORS 好了。
一般來說,瀏覽器會禁止來自其他網域的資源,除非有取得網域資源的權限。這份權限就稱作 CORS。而 CORS 有兩種授權方法:simple 與 preflighted:simple 可以直接對伺服器請求,而 preflighted 則需要徵求伺服器同意。
以下條件全部集滿,才能發動 simple 授權,否則將為 preflighted 授權:
- HTTP 方法只能是
GET
、HEAD
、POST
其中之一。 - HTTP 標頭只有
Connection
、User-Agent
、forbidden header name、CORS-safelisted request-header 標頭。 - HTTP
Content-Type
標頭只能是application/x-www-form-urlencoded
、multipart/form-data
、text/plain
其中之一。
simple 授權會在請求標頭內多出 Origin
標頭,回應則多出 Access-Control-Allow-Origin
標頭;<br />
preflighted 授權則會先發動 OPTIONS
請求,待回應後再發起含有 Origin
標頭的請求。
jQuery AJAX 雖然有 type : "jsonp"
API 能用,但那樣會讓純 JSON 檔案出問題。所以還是要想辦法完成 CORS…axios 大概也是這樣……
最糟糕的其實是把遞歸寫壞,結果瀏覽器載到死掉……