在 JS 中如何使用 Ajax 來進行請求

做者:Danny Markov
譯者:前端小智
來源:tutorialzine
點贊再看,微信搜索 【大遷世界】關注這個沒有大廠背景,但有着一股向上積極心態人。本文 GitHub https://github.com/qq44924588... 上已經收錄,文章的已分類,也整理了不少個人文檔,和教程資料。**

最近開源了一個 Vue 組件,還不夠完善,歡迎你們來一塊兒完善它,也但願你們能給個 star 支持一下,謝謝各位了。javascript

github 地址:https://github.com/qq44924588...前端

在本教程中,咱們將學習如何使用 JS 進行AJAX調用。vue

1.AJAX

術語AJAX 表示 異步的 JavaScript 和 XMLjava

AJAX 在 JS 中用於發出異步網絡請求來獲取資源。固然,不像名稱所暗示的那樣,資源並不侷限於XML,還用於獲取JSON、HTML或純文本等資源。ios

有多種方法能夠發出網絡請求並從服務器獲取數據。 咱們將一一介紹。git

2.XMLHttpRequest

XMLHttpRequest對象(簡稱XHR)在較早的時候用於從服務器異步檢索數據。github

之因此使用XML,是由於它首先用於檢索XML數據。如今,它也能夠用來檢索JSON, HTML或純文本。web

事例 2.1: GET

function success() {
  var data = JSON.parse(this.responseText)
  console.log(data)
}

function error (err) {
  console.log('Error Occurred:', err)
}

var xhr = new XMLHttpRequest()
xhr.onload = success
xhr.onerror = error
xhr.open("GET", ""https://jsonplaceholder.typicode.com/posts/1")
xhr.send()

咱們看到,要發出一個簡單的GET請求,須要兩個偵聽器來處理請求的成功和失敗。咱們還須要調用open()send()方法。來自服務器的響應存儲在responseText變量中,該變量使用JSON.parse()轉換爲JavaScript 對象。chrome

function success() {
    var data = JSON.parse(this.responseText);
    console.log(data);
}

function error(err) {
    console.log('Error Occurred :', err);
}

var xhr = new XMLHttpRequest();
xhr.onload = success;
xhr.onerror = error;
xhr.open("POST", "https://jsonplaceholder.typicode.com/posts");
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xhr.send(JSON.stringify({
    title: 'foo',
    body: 'bar',
    userId: 1
  })
);

咱們看到POST請求相似於GET請求。 咱們須要另外使用setRequestHeader設置請求標頭「Content-Type」 ,並使用send方法中的JSON.stringify將JSON正文做爲字符串發送。json

2.3 XMLHttpRequest vs Fetch

早期的開發人員,已經使用了好多年的 XMLHttpRequest來請求數據了。 現代的fetch API容許咱們發出相似於XMLHttpRequest(XHR)的網絡請求。 主要區別在於fetch() API使用Promises,它使 API更簡單,更簡潔,避免了回調地獄。

3. Fetch API

Fetch 是一個用於進行AJAX調用的原生 JavaScript API,它獲得了大多數瀏覽器的支持,如今獲得了普遍的應用。

3.1 API用法

fetch(url, options)
    .then(response => {
        // handle response data
    })
    .catch(err => {
        // handle errors
    });

API參數

fetch() API有兩個參數

  1. url是必填參數,它是您要獲取的資源的路徑。
  2. options是一個可選參數。不須要提供這個參數來發出簡單的GET請求。

    • method: GET | POST | PUT | DELETE | PATCH
    • headers: 請求頭,如 { 「Content-type」: 「application/json; charset=UTF-8」 }

      • mode: cors | no-cors | same-origin | navigate
      • cache: default | reload | no-cache
      • body: 通常用於POST請求

API返回Promise對象

fetch() API返回一個promise對象。

  • 若是存在網絡錯誤,則將拒絕,這會在.catch()塊中處理。
  • 若是來自服務器的響應帶有任何狀態碼(如200404500),則promise將被解析。響應對象能夠在.then()塊中處理。

錯誤處理

請注意,對於成功的響應,咱們指望狀態代碼爲200(正常狀態),可是即便響應帶有錯誤狀態代碼(例如404(未找到資源)和500(內部服務器錯誤)),fetch() API 的狀態也是 resolved,咱們須要在.then() 塊中顯式地處理那些。

咱們能夠在response 對象中看到HTTP狀態:

  • HTTP狀態碼,例如200。
  • ok –布爾值,若是HTTP狀態代碼爲200-299,則爲true

3.3 示例:GET

const getTodoItem = fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .catch(err => console.error(err));

getTodoItem.then(response => console.log(response));
Response

 { userId: 1, id: 1, title: "delectus aut autem", completed: false }

在上面的代碼中須要注意兩件事:

  1. fetch API返回一個promise對象,咱們能夠將其分配給變量並稍後執行。
  2. 咱們還必須調用response.json()將響應對象轉換爲JSON

錯誤處理

咱們來看看當HTTP GET請求拋出500錯誤時會發生什麼:

fetch('http://httpstat.us/500') // this API throw 500 error
  .then(response => () => {
    console.log("Inside first then block");
    return response.json();
  })
  .then(json => console.log("Inside second then block", json))
  .catch(err => console.error("Inside catch block:", err));
Inside first then block
➤ ⓧ Inside catch block: SyntaxError: Unexpected token I in JSON at position 4

咱們看到,即便API拋出500錯誤,它仍然會首先進入then()塊,在該塊中它沒法解析錯誤JSON並拋出catch()塊捕獲的錯誤。

這意味着若是咱們使用fetch()API,則須要像這樣顯式地處理此類錯誤:-

fetch('http://httpstat.us/500')
  .then(handleErrors)
  .then(response => response.json())
  .then(response => console.log(response))
  .catch(err => console.error("Inside catch block:", err));

function handleErrors(response) {
  if (!response.ok) { // throw error based on custom conditions on response
      throw Error(response.statusText);
  }
  return response;
}
➤ Inside catch block: Error: Internal Server Error at handleErrors (Script snippet %239:9)

3.3 示例:POST

fetch('https://jsonplaceholder.typicode.com/todos', {
    method: 'POST',
    body: JSON.stringify({
      completed: true,
      title: 'new todo item',
      userId: 1
    }),
    headers: {
      "Content-type": "application/json; charset=UTF-8"
    }
  })
  .then(response => response.json())
  .then(json => console.log(json))
  .catch(err => console.log(err))
Response

➤ {completed: true, title: "new todo item", userId: 1, id: 201}

在上面的代碼中須要注意兩件事:-

  1. POST請求相似於GET請求。 咱們還須要在fetch() API的第二個參數中發送methodbodyheaders 屬性。
  2. 咱們必須須要使用 JSON.stringify() 將對象轉成字符串請求body 參數

4.Axios API

Axios API很是相似於fetch API,只是作了一些改進。我我的更喜歡使用Axios API而不是fetch() API,緣由以下:

  • 爲GET 請求提供 axios.get(),爲 POST 請求提供 axios.post()等提供不一樣的方法,這樣使咱們的代碼更簡潔。
  • 將響應代碼(例如40四、500)視爲能夠在catch()塊中處理的錯誤,所以咱們無需顯式處理這些錯誤。
  • 它提供了與IE11等舊瀏覽器的向後兼容性
  • 它將響應做爲JSON對象返回,所以咱們無需進行任何解析

4.1 示例:GET

// 在chrome控制檯中引入腳本的方法

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://unpkg.com/axios/dist/axios.min.js';
document.head.appendChild(script);
axios.get('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => console.log(response.data))
  .catch(err => console.error(err));
Response

{ userId: 1, id: 1, title: "delectus aut autem", completed: false }

咱們能夠看到,咱們直接使用response得到響應數據。數據沒有任何解析對象,不像fetch() API。

錯誤處理

axios.get('http://httpstat.us/500')
  .then(response => console.log(response.data))
  .catch(err => console.error("Inside catch block:", err));
Inside catch block: Error: Network Error

咱們看到,500錯誤也被catch()塊捕獲,不像fetch() API,咱們必須顯式處理它們。

4.2 示例:POST

axios.post('https://jsonplaceholder.typicode.com/todos', {
      completed: true,
      title: 'new todo item',
      userId: 1
  })
  .then(response => console.log(response.data))
  .catch(err => console.log(err))
{completed: true, title: "new todo item", userId: 1, id: 201}

咱們看到POST方法很是簡短,能夠直接傳遞請求主體參數,這與fetch()API不一樣。


代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug

原文:https://tutorialzine.com/2017...

交流

文章每週持續更新,能夠微信搜索【大遷世界 】第一時間閱讀,回覆【福利】有多份前端視頻等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 已經收錄,歡迎Star。

相關文章
相關標籤/搜索