# API: Ajax & jQuery
[REST-Client API檢測工具](https://www.gss.com.tw/blog/%E4%BD%BF%E7%94%A8-rest-client-%E4%BE%86%E6%B8%AC%E8%A9%A6-api-vs-code%E6%93%B4%E5%85%85%E5%A5%97%E4%BB%B6)
## RESTful API
Representational State Transfer是一種軟體架構風格,主要用於製作Web API。REST API是一種透過HTTP協定來存取網路資源的API,並遵循REST架構風格。
REST API通常使用HTTP要求方法(如GET、POST、PUT、DELETE)與URI(或稱網址)來操作資源。它通常回應JSON或XML格式的資料,以表示資源的狀態。
REST API的優點包括:簡單易用、支援跨網路的資源存取、與多種程式語言相容、可扩展性高等。因此,REST API已經被廣泛應用於Web應用程式、移動應用程式、IoT等多種不同的領域。
## Ajax
Asynchronous JavaScript and XML是一種網頁開發技術,它可以讓開發人員在不重新載入整個頁面的情況下,更新部分頁面內容。它通過利用 JavaScript 和 XML 在背景下向伺服器發送請求並獲取資料,並在客戶端頁面加以更新,以實現快速非同步的網頁互動。Ajax 的主要特點是可以更新特定區域,而不是整個頁面,這可以使網站更快,更順暢。
#### 原生JS:
```
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://[HOST_NAME]/api/[API_VERSION]/products/women", true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
// 处理数据
}
};
xhr.send();
```
#### fetch API:
```
fetch("https://[HOST_NAME]/api/[API_VERSION]/products/women")
.then(response => response.json())
.then(data => {
// 处理数据
})
.catch(error => {
console.error(error);
});
```
#### jQuery:
```
$.ajax({
url: 'URL',
type: 'REQUEST_METHOD',
dataType: 'RESPONSE_DATA_TYPE',
data: 'REQUEST_DATA',
success: function(response) {
// 成功的回應代碼
},
error: function(error) {
// 錯誤的回應代碼
}
});
```
* `url`:要請求的API的URL。
* `type`:要發送的HTTP請求的類型,如GET、POST、PUT、DELETE等。
* `dataType`(可選): JSON,XML,HTML,Text
* `data`(可選): 要發送的請求數據。
* `success`(可選): 成功獲得回應時要執行的函數。
* `error`(可選): 發生錯誤時要執行的函數。
#### `$.ajax` vs `fetch API`
* 語法: fetch API 的語法簡潔易懂,比較符合 JavaScript 語法,並且不需要使用其他第三方庫。而 $.ajax 是 jQuery 的語法,需要引用 jQuery 庫才能使用。
* 回應格式: fetch API 回傳的是一個 Promise,它需要進一步解析成 JSON 或其他格式。而 $.ajax 可以直接進行回應資料的解析。
* 功能: fetch API 只支援 GET 和 POST 方法,如果需要其他方法,需要進一步封裝。而 $.ajax 支援大多數的 HTTP 請求方法,例如 PUT、DELETE、HEAD 等。
對於簡單的AJAX請求,jQuery的操作可以比較方便和簡潔。jQuery封裝了一些常用的AJAX請求的方法,比如`$.ajax()`, `$.get()`, `$.post()`等。但是,如果您需要對Ajax的運作方式進行更多的控制,那麼使用原生的JavaScript API可能更好,例如:
1. 瀏覽器兼容性:如果您需要在較舊的瀏覽器中運行您的應用程序,則可以使用XMLHttpRequest,因為它在許多瀏覽器中得到了實現。
2. 自定義錯誤處理:如果您需要進行更細節的錯誤處理,可以使用XMLHttpRequest,因為它提供了錯誤處理的許多方法,如onerror和ontimeout。
3. 取消需求:如果您需要在過程中取消需求,可以使用XMLHttpRequest,因為它提供了abort方法。
4. 預載指定資源:如果您需要在頁面加載完成之前預先加載某些資源,可以使用XMLHttpRequest,因為它提供了更多的控制選項
5. 瀏覽器支援Service Worker的情況下,可以使用fetch API與Service Worker配合實現離線請求,支援異步請求和更高的控制細節。而jQuery的$.ajax()不支援這種功能
## jQuery syntax和方法
* `$('#content')`:`document.querySelectorAll()`方法的一個簡寫
* 顯示和隱藏 HTML 元素
```
$('.element').show(); // 讓元素的 display CSS 屬性變為預設的值,如果元素的 display 屬性預設為 none,則它會變為 block。
$('.element').hide(); // 讓元素的 display CSS 屬性變為 none,隱藏該元素。
```
* `.scroll()`:绑定或触发元素的 scroll 事件,在滚动元素时可以触发指定的函数。
* `$(window).scrollTop()`:取得網頁目前滾動到的頂端距離;
* `$(window).height()`:取得網頁可視區域的高度;
* `$(document).height()`:取得整個文件的高度;
* `.off()`:移除元素上绑定的事件处理程序。
* 在元素的最後面添加內容
```
$("#someId").append("<p>This is a new paragraph</p>");
```
## API
一般來說,若 API 資料是 JSON 格式,回傳的也會是 JSON 格式。
在 $.ajax() 中,可以透過 dataType 參數指定回傳資料的格式(會幫忙轉換)。
#### JSON
JavaScript Object Notation是一種輕量級的資料交換格式,主要用於網頁前端與後端交互數據。它使用文本格式存儲資料,數據結構用鍵值對表示,類似 JavaScript Object,但與 JavaScript Object不同的是,JSON 可以被解析為多種語言中的Object。因此,它在網路上遠程資料交換方面非常流行,常被作為 Web API 的回傳格式。
#### XML
Extensible Markup Language是一種用於存儲和傳輸資料的標準格式。它是 HTML 的一個超集,它可以存儲除 HTML 标签外的更多类型的数据,例如音频、视频、图像等。XML 文档的格式是用户定义的,这意味着不同的 XML 文档可以有不同的格式。由于 XML 可以很好地整合到许多计算机语言和平台中,因此它已成为许多网络应用程序的常用格式
#### JSON vs XML
XML和JSON是兩种不同的資料交換格式,在選擇使用XML或JSON時,需要考慮以下因素:
* 可讀性:XML是易讀的,因為它具有很好的結構,可以清晰地表示資料。相反,JSON是以鍵值形式組織的,可能不如XML易讀。
* 網路傳輸時間:JSON通常比XML更快,因為它的大小更小。
* 支援與擴展性:如果你的應用程式需要其他的支援,如查詢,排序和分頁,則XML可能更適合。但是,如果需要在支援多種程式語言的同時交換資料,則JSON可能是更好的選擇。
#### 傳遞參數給API的不同方式
1. 在 URL 中加入參數
將參數附加到URL末尾,作為查詢字符串(?page= + page)。這種方法將參數作為網址的一部分傳遞。
```
$.ajax({
url: https://my-api.com/products?page=' + page,
...
```
2. 通過「data」選項將資訊以「鍵值對」的形式傳遞
它將鍵值對作為Content-Type: application/x-www-form-urlencoded格式的資料附加到請求正文中。
```
$.ajax({
url: 'https://my-api.com/products',
data: {
page: page,
},
...
```
* 比較:
如果你的參數是簡單的,則查詢字符串可能是更簡單的選擇。
如果你需要傳遞大量的複雜參數,則鍵值對可能是最佳選擇,因為它允許將複雜的參數封裝在一個對象中。且因為參數不會出現在 URL 上,不會對網址長度造成影響,並且在傳遞複雜的參數時更方便管理。
## 用ajax更改url
#### window.history
是 JavaScript 中一个表示浏览器历史记录的object。通过它,可以访问浏览器中所有已访问页面的 URL,并可以对它们进行操作。history object提供了一些方法,如 `back()` 和 `forward()`,用于在历史记录中向前或向后浏览。
* pushState() 方法:将一个新的状态推入历史记录栈。这个方法接受三个参数:一个状态对象(可以为空),一个页面标题(目前被忽略),以及将要显示的 URL。执行此操作后,URL 将发生更改,但浏览器不会加载该页面。
* replaceState() 方法:与 pushState() 类似,但不会在历史记录栈中创建一个新的状态。而是用新状态替换当前状态。这个方法接受三个参数:一个状态对象,一个页面标题(目前被忽略),以及将要显示的 URL。执行此操作后,URL 将发生更改,但浏览器不会加载该页面。
用來更改浏览器的 URL,而不会导致浏览器重新加载页面。这使得我们能够实现无需页面刷新的内容更新、历史记录管理、单页面应用程序等功能。