# Day3學前端 Frontend with React - *串接API with Ajax*
###### tags: `frontend`
Copyright 2021, [月下麒麟](https://hackmd.io/@YMont/note-catalog)
---
## Target
當前端與後端(backend)訂定完API後,即可各自進行工作
這邊要提及的是==如何在前端接收來自後端API的資料呢?==
## Concept
在舉例之前,得先了解對相關腳色與對應行為
**資料庫**
```C(create), R(read), U(update), D(delete)```
**後端**
```Post, Get, Put, Delete ```
**前、後端溝通的API**
```
http://127.0.0.1:8000/user/1
http://127.0.0.1:8000/users?index=1&end=10
```
>Request-
點擊瀏覽器 -> (前端) -> Request -> (後端) -> 要資料 -> (資料庫)
>Response-
>(資料庫) -> 給資料 -> (後端) -> Response -> (前端) -> 顯示資料於瀏覽器
## Implement
知道前後端如何溝通的行為後,會發現到當前端只要取得Request API
這樣就針對該支API去顯示資料即可
第二天的Hello World已經能成功的修改app.js檔
今天要延續這個檔案的修改操作
**Backend API Value**
假設我們後端的API已經製作完成了,它其實是會有值(value)
另外,由於網路傳遞資料大多是使用[JSON](https://zh.wikipedia.org/wiki/JSON)格式
故後端丟出來的資料也會以JSON格式呈現
![](https://i.imgur.com/ZPxZGbs.png)
![](https://i.imgur.com/WLv6NB6.png)
(後端之Browser view)
**接收 API**
```javascript=
let url= "http://127.0.0.1:8000/user/2";
let xh = new XMLHttpRequest();
xh.open('GET',url,true);
xh.send();
xh.onreadystatechange = function(){
if(this.readyState === 4 && this.status === 200){
let response = JSON.parse(this.response);
console.log(response);
}
};
```
**小重點:**
1.將XMLHttpRequest函式實作物件丟到變數xh,利用該變數進行一些操作,最後取得respose的內容
2.var, let, const宣告變數的差異。
reference:[JavaScript: var, let, const 差異](https://totoroliu.medium.com/javascript-var-let-const-%E5%B7%AE%E7%95%B0-e3d930521230)
reference:[[JS學徒特訓班] JavaScript ES6 : var, let, const 差異](https://codinggirl.timelog.to/a174653905)
3.如何接收來自Http的請求、函式解釋。
reference:[IT邦幫忙 Day21 AJAX(1): 科普 & XHR](https://ithelp.ithome.com.tw/articles/10203820)
reference:[【JavaScript瀏覽器】:實作串接 API ](https://jimmyswebnote.com/use-javascript-to-connect-api-with-unsplash/)
**Run React**
![](https://i.imgur.com/8mX5XRA.png)
```npm start```
![](https://i.imgur.com/Erap6s9.png)
![](https://i.imgur.com/KvGGmml.png)
(前端之Browser view)
*會發現一樣沒出現資料阿!*
別急==對瀏覽器按下F12,找到Console按鈕,打開該物件內容==
![](https://i.imgur.com/qNyyfvG.png)
就會發現該筆Json資料,以鍵值對的方式呈現
(*如果發現有錯誤訊息,請見文章最下方,補充2*)
今天就學到這裡,後續會再往**前端渲染畫面**的方向學習,這樣畫面就會越來越漂亮
中間會再穿插一些後端製作API的文章,敬請期待
---
**補充1 jQuery**
筆者發現有另一寫法可以達到一樣的目的。
**使用jQuery會更簡潔、直觀**...
需要先安裝jQuery
![](https://i.imgur.com/vp4bQgU.png)
```typescript=
npm install --save jquery
```
導入jQuery模組
```javascript=
import $ from 'jquery';
```
jQuery程式
```javascript=
$.ajax({
url:"http://localhost:8000/user/3",
type: "GET",
success: function(result){
console.log(result);
},
error: function(error){
console.log(error)
}
});
```
瀏覽器console內容顯示
![](https://i.imgur.com/0FMHg77.png)
---
**補充2 XMLHttpRequest Access Failed**
![](https://i.imgur.com/7uduFaV.png)
網路上有個**同源政策 Same-Origin Policy**
解法其實有很多種,其中一解法目的為讓前後端的網址為一同源
(筆者自己是在Python後端應用**CORS(Cross-Origin Resource Sharing)套件**即解決)
reference:[【Web】徹底理解同源政策(Same Origin Policy)](https://someone.tw/2020/05/20/web-same-origin-policy/)
reference:[[教學] CORS 是什麼? 如何設定 CORS?](https://shubo.io/what-is-cors/)
這兩篇其實講的很詳細,值得一讀喔! ![](https://i.imgur.com/FniW4zQ.png)
感謝您的收看~