fetch API

来源:https://www.cnblogs.com/gaoguowen/archive/2019/06/25/11084564.html
-Advertisement-
Play Games

fetch 一個獲取資源的介面,類似於 "ajax" 是基於 之上設計,舊版本IE 完全不支持,須藉助 "polyfill" 來相容 提供了對 Request 和 Response (以及其他與網路請求有關的)對象的通用定義 發送請求或者獲取資源,需要使用 window.fetch or Windo ...


fetch

  • 一個獲取資源的介面,類似於ajax
  • 是基於 Promise之上設計,舊版本IE 完全不支持,須藉助 polyfill來相容
  • 提供了對 Request 和 Response (以及其他與網路請求有關的)對象的通用定義
  • 發送請求或者獲取資源,需要使用 window.fetch or WindowOrWorkerGlobalScope.fetch 方法。

參數

資源路徑(url string)

  • 他必須接收一個需要請求的資源路徑,返回一個promise對象,請求成功的數據返回到Responese回調中,請求失敗的信息返回到 Request中。
  • 當接收到一個代表錯誤的 HTTP狀態碼時,fetch返回的promise不會被標記為 reject而會被標記為resolve,比如狀態碼為 404,500.只有網路故障或請求被阻止時才被標記為reject
fetch('https://api.apiopen.top/musicDetails1')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson); //{code: 400, message: "404 Not Found", result: "https://api.apiopen.top/musicDetails1"}
  })
  • fetch 預設是不會從服務端發送接收或發送任何 cookie,如果需要則必須設置 credentials,自 2017/8 起預設的credentials政策變更為same-originFirefox也在61.0b13中改變預設值

[, config]

  • 配置項對象,包括所有對請求的設置
  1. method: 請求使用的方法,如 GET、POST。

  2. headers: 請求的頭信息,形式為 Headers 的對象或包含 ByteString值的對象字面量。

  3. body:
    請求的 body信息:
    可能是:
    Blob( 表示一個不可變、原始數據的類文件對象)、
    BufferSource ( 用於表示自身為ArrayBuffer或者TypedArray提供對象的對象ArrayBufferView。)、
    FormData(表示表單數據的鍵值對的構造方式,經過它的數據可以使用XMLHttpRequest.send() 方法送出,本介面和此方法都相當簡單直接。如果送出時的編碼類型被設為 "multipart/form-data",它會使用和表單一樣的格式。)、
    URLSearchParams (介面定義了一些實用的方法來處理 URL 的查詢字元串)
    或者 USVString 對象。

  4. mode: 請求的模式,如 cors、 no-cors 或者 same-origin

  5. credentials: 請求的 credentials,如 omit、same-origin 或者 include。為了在當前功能變數名稱內自動發送 cookie , 必須提供這個選項, 從 Chrome 50 開始, 這個屬性也可以接受 FederatedCredential 實例或是一個 PasswordCredential 實例。
    5.1 如果需要跨域請求需設置為 "include"
    5.2 如果只在同域內發送cookie 則設置為 "same-origin"
    5.3 如果任何情況都不發送cookie 則設置為 "omit"

  6. cache: 請求的 cache 模式: default 、 no-store 、 reload 、 no-cache 、 force-cache 或者 only-if-cached

  7. redirect: 可用的redirect 模式:follow(自動重定向), error (如果產生重定向將自動終止並且拋出一個錯誤), 或者manual (手動處理重定向). 在Chrome中,Chrome 47之前的預設值是 follow,從 Chrome 47開始是manual

  8. referrer: 一個USVString 可以是 no-referrer、client或一個URL。預設是client

  9. referrerPolicy:指定引用HTTP頭的值。可能是一個 no-referrer、 no-referrer-when-downgrade、 origin、 origin-when-cross-origin、 unsafe-url 。

  10. integrity: 包括請求的 subresource integrity值 例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。

const Fetch = function (url,config){
   if(typeof(config) !== 'object' || config === null) return throw `Config needs to pass an object type`
  let data = config || {} ;
  let {method = 'GET', param = null, mode = "cors", cache = "no-cache",headers = {'Access-Control-Allow-Origin': '*',
    'content-type': 'application/json'}, redirect = "follow", credentials = "include", referrer = "no-referrer"} = data;
  /*  // 傳輸 JSON 數據 需將 param 轉換 
    JSON.stringify(param)
    //上傳文件 需傳輸 formData 格式
    let formData = new FormData()
    let fileField = document.querySelector("#myFile")
    formData.append('title',"My File")
    formData.append('fileField ',fileField .files[0])
    
  */

  return  fetch(url,{
   method:method.toUpperCase(),
   body:param,
   mode,
   cache,
   headers,
   redirect,
   credentials,
}).then(res =>{
   if(res.ok) return res.json() 
    throw new Error("Network response fail:"+res.status)
}
).catch(err=>console.error(err))
}

Fetch('https://api.apiopen.top/musicDetails1',{credentials:'omit'}).then(res =>console.log(res)).catch(err=>console.error(err))

Headers constructor

一個 headers 對象是一個簡單的多名值對:

let content = "Hello World";
let myHeaders = new Headers();
myHeaders.append("Content-Type", "text/plain");
myHeaders.append("Content-Length", content.length.toString());
myHeaders.append("X-Custom-Header", "ProcessThisImmediately");

可以傳一個多維數組或者對象字面量:

let content = "Hello World";
let myHeaders = new Headers({
  "Content-Type": "text/plain",
  "Content-Length": content.length.toString(),
  "X-Custom-Header": "ProcessThisImmediately",
});

//獲取和設置
console.log(myHeaders.has("Content-Type")); // true
console.log(myHeaders.has("Set-Cookie")); // false
myHeaders.set("Content-Type", "text/html");
myHeaders.append("X-Custom-Header", "AnotherValue");
 
console.log(myHeaders.get("Content-Length")); // 11
console.log(myHeaders.getAll("X-Custom-Header")); // ["ProcessThisImmediately", "AnotherValue"]
 
myHeaders.delete("X-Custom-Header");
console.log(myHeaders.getAll("X-Custom-Header")); // [ ]

如果使用了一個不合法的HTTP Header屬性名,那麼Headers的方法通常都拋出 TypeError 異常。如果不小心寫入了一個不可寫的屬性,也會拋出一個 TypeError 異常。除此以外的情況,失敗了並不拋出異常。

檢查 content type 是否正確

fetch(myRequest).then(function(response) {
  if(response.headers.get("content-type") === "application/json") {
    return response.json().then(function(json) {
      // process your JSON further
    });
  } else {
    console.log("Oops, we haven't got JSON!");
  }
});

Response 對象

  • fetch 返回的對象

對象中常用的屬性

  1. status: 響應狀態碼 如 200 404 等
  2. statusText:返回和狀態碼對應信息
  3. ok 檢查狀態碼是否 在 200-299之間,返回true or false

檢查環境支持度

if(this.fetch) {
    // run my fetch request here
} else {
    // do something with XMLHttpRequest?
}

相容性

Fetch規範


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、負載均衡的作用 1、轉發功能 按照一定的演算法【權重、輪詢】,將客戶端請求轉發到不同應用伺服器上,減輕單個伺服器壓力,提高系統併發量。 2、故障移除 通過心跳檢測的方式,判斷應用伺服器當前是否可以正常工作,如果伺服器期宕掉,自動將請求發送到其他應用伺服器。 3、恢復添加 如檢測到發生故障的應用服務 ...
  • 一 Kubernetes dashboard簡介 1.1 Web UI簡介 dashboard是基於Web的Kubernetes用戶界面。可以使用dashboard將容器化應用程式部署到Kubernetes集群,對容器化應用程式進行故障排除,以及管理集群資源。可以使用dashboard來概述群集上運 ...
  • lsof介紹 安裝lsof 使用lsof ...
  • 什麼時候需要安裝 如果使用 protoc 命令,遇到 Protoc not found ,表示未安裝。或者,執行時出現錯誤: This parser only recognizes "proto2" ,則表示不是3.0版。 安裝過程及可能遇到的問題 安裝指令 詳細介紹請參考此文: "protobuf ...
  • 前言 最近一段時間都在做小程式。 雖然是第二次開發小程式,但是上次做小程式已經是一年前的事了,所以最終還是被坑得死去活來。 這次是從零開始開發一個小程式,其實除了一些莫名其妙的相容性問題,大多數坑點都是在微信小程式的各個入口場景處。 所以這裡整理一下微信小程式的各個入口場景,以及從這些入口場景進入小 ...
  • 背景 起因是產品的需求,需要更換Electron為底層平臺,但因為會有不少定製化的功能要實現,必須自己實現此類內容,所以也就導致必須自己編譯Electron的源代碼。 整個構建過程,看Electron的構建文檔就行了:https://github.com/electron/i18n/blob/mas ...
  • em與rem之間的區別: 共同點: 不同點: 實例: rem適配方案: 核心原理:寬度和高度都能做到適配(等比縮放) 通過控制 html 元素上的字體大小去控制頁面上所有以rem為單位的基準值,控制尺寸 核心換算公式:當前rem基準值 = 預設基準值 / 設計稿寬度 * 當前設備的寬度 技術:媒體查 ...
  • 1. uni app採坑記錄 1.1. 前言 1. 這裡記錄下uni app實踐中踩的坑 1.2. 坑點 1.2.1. 觸發事件 和`@longpress` 這兩個都表示長按觸發事件,那麼這兩個有啥區別呢? 經過實踐,發現在微信和h5端只有longpress起效果,在支付寶小程式端只有longTap ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...