# text-cors 查詢 API 是否有跨網域功能 ###### tags: `javascript` `API` `CORS` `XMLHttpRequest` `axios` ## API 種類 1. 可以在瀏覽器端讀取使用,不需申請帳號:[2021 前端工程師薪資資料](https://raw.githubusercontent.com/hexschool/2021-ui-frontend-job/master/frontend_data.json?token=AAQWFQDSNRRXC6FBW7PDSETBOESVW) 2. 可以在瀏覽器端讀取使用,需要申請帳號獲得金鑰: [Google Map](https://developers.google.com/maps/documentation/javascript/adding-a-google-map#key) 3. 只能在**後端伺服器**讀取,不需申請帳號: [台南旅遊人數](https://data.tainan.gov.tw/dataset/tourists-statis) 4. 只能在**後端伺服器**讀取,需要申請帳號獲得金鑰: [NEWS API](https://newsapi.org/) > 1.用 [text-cors](https://www.test-cors.org/) 工具,模擬發送跨域請求觀察是否能介接 > 2.瀏覽器端讀取關鍵 header 參數:==Access-Control-Allow-Origin: *== ## [每日任務](https://hackmd.io/8Uos2GP4TVSuxUuQWpu1GQ?view) ### 題目: * 注意事項 請同學參考[第八週錄影檔 - 上半部](https://courses.hexschool.com/courses/20201113/lectures/36582917),了解如何測試 API 是否可以使用。 * 重點一. 用 [test-cors](https://www.test-cors.org/) 觀察是否能介接。 ==text-cors 是模擬發送跨域請求、觀察是否能介接的工具== * 重點二. response header 參數:Access-Control-Allow-Origin: * ==是瀏覽器端能否提供讀取的關鍵設定== * 問題 以下是各個不同的 API 連結,請問以下哪些網址「可以」透過 axios 「在瀏覽器端」讀取使用? 1. 「全球運動場館資訊網」: [網址一](https://iplay.sa.gov.tw/api/GymSearchAllList?$format=application/json;odata.metadata=none&Keyword=%E6%A3%92%E7%90%83%E5%A0%B4%20%E5%9C%8B%E5%B0%8F&City=%E9%AB%98%E9%9B%84%E5%B8%82&GymType=%E6%A3%92%E7%90%83%E5%A0%B4&Latitude=22.6239746&Longitude=120.305267) 2. 「Unsplash」:[網址二](https://api.unsplash.com/photos/?client_id=YOUR_ACCESS_KEY) 3. 「里長資訊網」:[網址三](https://cabu4.kcg.gov.tw/KcgRegion/OpenData/%E9%87%8C%E9%95%B7%E9%80%9A%E8%A8%8A%E9%8C%84.JSON) 4. 「中央氣象局開放資料平臺」:[網址四](https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-8C36EA7F-A9E1-4242-9463-66006731040A&format=JSON) 5. 「旅遊人數明細表」 :[網址五](https://culture.tainan.gov.tw/shared/Statistics_Json) ### 解題: 1. 「全球運動場館資訊網」: [網址一](https://iplay.sa.gov.tw/api/GymSearchAllList?$format=application/json;odata.metadata=none&Keyword=%E6%A3%92%E7%90%83%E5%A0%B4%20%E5%9C%8B%E5%B0%8F&City=%E9%AB%98%E9%9B%84%E5%B8%82&GymType=%E6%A3%92%E7%90%83%E5%A0%B4&Latitude=22.6239746&Longitude=120.305267) ==(O)== XHR status: 200 ※ 透過 test-cors 發出 request 再來看,==有參數:Access-Control-Allow-Origin: *== 可以直接把打開檔案的這步驟,當成是一種初步去檢查是否可以取得資源的方式 ==但實際發 xhr request 會不會被擋,就是發 xhr 去看才知道。== 1. 「Unsplash」:[網址二](https://api.unsplash.com/photos/?client_id=YOUR_ACCESS_KEY) ==(X)== XHR status: 401 有參數:Access-Control-Allow-Origin: * HTTP Status Code: 401 伺服器收到未經身份驗證的請求 1. 「里長資訊網」:[網址三](https://cabu4.kcg.gov.tw/KcgRegion/OpenData/%E9%87%8C%E9%95%B7%E9%80%9A%E8%A8%8A%E9%8C%84.JSON) ==(X)== Fired XHR event: error XHR status: 0 沒有參數:Access-Control-Allow-Origin: * HTTP Status Code: 200 1. 「中央氣象局開放資料平臺」:[網址四](https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-8C36EA7F-A9E1-4242-9463-66006731040A&format=JSON) ==(O)== XHR status: 200 有參數:Access-Control-Allow-Origin: * HTTP Status Code: 200 1. 「旅遊人數明細表」 :[網址五](https://culture.tainan.gov.tw/shared/Statistics_Json) ==(X)== Fired XHR event: error XHR status: 0 沒有參數:Access-Control-Allow-Origin: * HTTP Status Code: 200 ## 助教補充 [Notion 文件](https://moored-espadrille-379.notion.site/11-29-ad75a273095e4107a8a7ec63233511ef) ### 重點: * 首先,要了解什麼情況下會使用到 CORS * 從 MDN 文件[這部分](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CORS#%E5%93%AA%E4%BA%9B%E8%AB%8B%E6%B1%82%E6%9C%83%E4%BD%BF%E7%94%A8_cors%EF%BC%9F)就有寫到是『使用 XMLHttpRequest 或 Fetch API 進行跨站請求』 * 題目:可以透過 axios 讀取 → 可以跨域請求(axios 在瀏覽器環境下使用 XMLHttpRequest 請求) * 從提供的連結 network 直接打開檔案,可以在 network 發現它的 type 是 document 不是 xhr,所以即使沒有 acceess-control-allow-origin 標註,可能是請求此檔案時沒有設定,但不一定是在 xhr 時就無法被跨域請求。 * 同上面文件說的,會使用到 CORS 的話情況是跨站請求,那要比較準確的來看 acceess-control-allow-origin,可以盡量透過 test-cors 發出 request 再來看。 * 簡單來說,可以直接把打開檔案的這步驟,當成是一種初步去檢查是否可以取得資源的方式,但實際發 xhr request 會不會被擋,就是發 xhr 去看才知道。 ### QA: * 同學提問: > 請問里長資訊網用 text-cors 查詢之後狀態碼是 0,用瀏覽器看狀態碼是 200,但是對里長資訊網來說這兩者的請求(get) 應該是一樣的,為什麼會有不一樣的狀態碼呢? * 助教回答: >在執行 GET / POST 請求之前,會先執行預檢請求,它預檢通過了,所以可以看到 network 狀態碼 200 而實際上被 CORS 擋下,沒有實際請求回內容,所以 xhr status 為 0
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.