---
# System prepended metadata

title: AJAX API 講解
tags: [' axios', AJAX, ' 非同步']

---

---
title: AJAX API 講解
tags: AJAX, axios, 非同步,
description:
---

AJAX API 講解
---

### 網路請求種類

:point_right: [HTTP 請求方法](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods)

:::success
POST 方法用於**提交指定資源的實體**，通常會**改變**伺服器的狀態或副作用（side effect）。
:::

---

### 四種常見的 POST 請求 content-type 

**發出請求的資料格式 request header Content-Type**

1. application/x-www-from-urlencoded
    - 透過HTML`<form>`表單 

2. application/json
    - 把資料包裝成`JSON`格式 

3. multipart/from-data
    - 傳送檔案或圖片

4. text/plain
    - 記事本格式

要依照對方伺服器的`request header Content-Type`的格式，來編寫資料格式，對方伺服器才能**正確接收到**發出請求

---

### 透過 axios 實做註冊 post 網路請求

- 變數`registerData`依照`application/json`格式，編輯發出**post註冊請求的物件資料**。

- `.post()`請求填入`API網址(字串)`、變數`registerData`，`axios.post('API網址', registerData)`。
    
- 發出post註冊請求**無誤**，會接收到**正確**回傳，觸發.then()，箭頭函式參數`response`接收資料。
    ![](https://i.imgur.com/JxdVLqq.png)

    
- 發出post註冊請求**錯誤**，會接收到**錯誤**回傳，觸發.catch()，箭頭函式參數`err`接收資料。

```javascript=
const registerData = {
  email: 'abcd@gmail.com',
  password: '12345678'
};

axios.post('https://hexschool-tutorial.herokuapp.com/api/signup', registerData)
  .then((response) => {
    console.log(response);
  })
  .catch((err) => {
    console.log(err);
  }); 
```
    
---
    
### 實做 axios DOM 表單註冊流程

輸入帳號、密碼並點擊按鈕送出，axios發出post請求給伺服器，在畫面上顯示伺服器回傳的response.data.message資訊。

![](https://i.imgur.com/GOf39Gz.png =30%x)

**HTML部分**
```htmlmixed=
<label for="account">帳號：</label>
<input type="text" id="account" class="account" placeholder="輸入帳號">
<br>
<label for="password">密碼：</label>
<input type="text" id="password" class="password" placeholder="輸入密碼">
<br>
<button type="button" class="send">送出</button>
<h4 class="resultMsg"></h4>
```
<br>

**JavaScript部分**

- `document.querySelector()`分別把`<input>`、`<button>`、`<h4>`選擇起來，並賦予給變數。

- 函式`signUp()`把post請求要送出的`JSON`資料、`axios`程式碼，全都封裝在一起。

- 把輸入email的`<input>`元素的value值，賦予到`JSON`資料`registerData.email`。

- 把輸入password的`<input>`元素的value值，賦予到`JSON`資料`registerData.password`。

- `axios`不管是`.then((response) => {})`或`.catch((err) => {})`接收到的資料，都賦予給變數`resultMsg.textContent`做狀態的呈現。

```javascript=
const account = document.querySelector('.account');
const password = document.querySelector('.password');
const send = document.querySelector('.send');
const resultMsg = document.querySelector('.resultMsg');

send.addEventListener('click', (e) => {
  signUp();
  account.value = '';
  password.value = '';
});

function signUp(){
  let registerData = {
    email: '',
    password: ''
  };
  registerData.email = account.value;
  registerData.password = password.value;
  axios.post('https://hexschool-tutorial.herokuapp.com/api/signup', registerData)
    .then((response) => {
      resultMsg.textContent = response.data.message;
    })
    .catch((err) => {
      resultMsg.textContent = err.data.message;
    });
};
```