[轉] 學會fetch的用法

fetch是web提供的一個能夠獲取異步資源的api,目前尚未被全部瀏覽器支持,它提供的api返回的是Promise對象,因此你在瞭解這個api前首先得了解Promise的用法。參考阮老師的文章javascript

那咱們首先講講在沒有fetch的時候,咱們是如何獲取異步資源的:html

//發送一個get請求是這樣的:

//首先實例化一個XMLHttpRequest對象
var httpRequest = new XMLHttpRequest();

//註冊httpRequest.readyState改變時會回調的函數,httpRequest.
//readyState共有5個可能的值,
//0	UNSENT (未打開)	open()方法還未被調用;
//1	OPENED  (未發送)	send()方法還未被調用;
//2	HEADERS_RECEIVED (已獲取響應頭)	send()方法已經被調用, 響應頭和響應狀態已經返回;
//3	LOADING (正在下載響應體)	響應體下載中; responseText中已經獲取了部分數據;
//4	DONE (請求完成)	整個請求過程已經完畢.
httpRequest.onreadystatechange = function(){
 //該回調函數會被依次調用4次
 console.log(httpRequest.readyState);

 if(httpRequest.readyState===4){
   //請求已完成
   if(httpRequest.status===200){
     //http狀態爲200
     console.log(httpRequest.response);

     var data = JSON.parse(httpRequest.response);
     console.log(data);
   }
 }

}

//請求的網址
var url = "http://127.0.0.1:7777/list";
//該方法爲初始化請求,第一個參數是請求的方法,好比GET,POST,PUT,第二個參數是請求的url
httpRequest.open('GET',url,true);

//設置http請求頭
httpRequest.setRequestHeader("Content-Type","application/json");

//發出請求,參數爲要發送的body體,若是是GET方法的話,通常無需發送body,設爲空就能夠
httpRequest.send(null);

關於XMLHttpRequest的更多用法請參照:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest#open()java

若是用了fetch以後,發送一個get請求是這樣的:git

//請求的網址
var url = "http://127.0.0.1:7777/list";
//發起get請求
var promise = fetch(url).then(function(response) {

   //response.status表示響應的http狀態碼
   if(response.status === 200){
     //json是返回的response提供的一個方法,會把返回的json字符串反序列化成對象,也被包裝成一個Promise了
     return response.json();
   }else{
     return {}
   }

});
    
promise = promise.then(function(data){
  //響應的內容
	console.log(data);
}).catch(function(err){
	console.log(err);
})

接下來介紹下fetch的語法:github

/**
參數:
input:定義要獲取的資源。可能的值是:一個URL或者一個Request對象。
init:可選,是一個對象,參數有:
	method: 請求使用的方法,如 GET、POST。
	headers: 請求的頭信息,形式爲 Headers 對象或 ByteString。
	body: 請求的 body 信息:多是一個 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 對象。注意 GET 或 HEAD 方法的請求不能包含 body 信息。
	mode: 請求的模式,如 cors、 no-cors 或者 same-origin,默認爲no-cors,該模式容許來自 CDN 的腳本、其餘域的圖片和其餘一些跨域資源,可是首先有個前提條件,就是請求的 method 只能是HEAD、GET 或 POST。此外,若是 ServiceWorkers 攔截了這些請求,它不能隨意添加或者修改除這些以外 Header 屬性。第三,JS 不能訪問 Response 對象中的任何屬性,這確保了跨域時 ServiceWorkers 的安全和隱私信息泄漏問題。cors模式容許跨域請求,same-origin模式對於跨域的請求,將返回一個 error,這樣確保全部的請求遵照同源策略。
	credentials: 請求的 credentials,如 omit、same-origin 或者 include。
	cache:  請求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.
返回值:一個 Promise,resolve 時回傳 Response 對象。
*/
fetch(input, init).then(function(response) {  });

一個發送post請求的示例:web

fetch("http://127.0.0.1:7777/postContent", {
  method: "POST",
  headers: {
      "Content-Type": "application/json",
  },
  mode: "cors",
  body: JSON.stringify({
      content: "留言內容"
  })
}).then(function(res) {
  if (res.status === 200) {
      return res.json()
  } else {
      return Promise.reject(res.json())
  }
}).then(function(data) {
  console.log(data);
}).catch(function(err) {
  console.log(err);
});

若是考慮低版本瀏覽器的問題的話,引入https://github.com/github/fetch/blob/master/fetch.js 便可兼容。json

相關文章
相關標籤/搜索