在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開發(fā)實(shí)戰(zhàn):網(wǎng)絡(luò)請(qǐng)求庫(kù)【axios】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-25 16:47 ? 次閱讀

簡(jiǎn)介

[Axios] ,是一個(gè)基于 promise 的網(wǎng)絡(luò)請(qǐng)求庫(kù),可以運(yùn)行 node.js 和瀏覽器中。本庫(kù)基于[Axios]原庫(kù)v1.3.4版本進(jìn)行適配,使其可以運(yùn)行在 OpenHarmony,并沿用其現(xiàn)有用法和特性。

  • http 請(qǐng)求
  • Promise API
  • request 和 response 攔截器
  • 轉(zhuǎn)換 request 和 response 的 data 數(shù)據(jù)
  • 自動(dòng)轉(zhuǎn)換 JSON data 數(shù)據(jù)

下載安裝

ohpm install @ohos/axios

需要權(quán)限

ohos.permission.INTERNET

接口和屬性列表

接口列表

接口參數(shù)功能
axios(config)[config]:請(qǐng)求配置發(fā)送請(qǐng)求
axios.create(config)[config]:請(qǐng)求配置創(chuàng)建實(shí)例
axios.request(config)[config]:請(qǐng)求配置發(fā)送請(qǐng)求
axios.get(url[, config])url:請(qǐng)求地址 [config]:請(qǐng)求配置發(fā)送get請(qǐng)求
axios.delete(url[, config])url:請(qǐng)求地址 [config]:請(qǐng)求配置發(fā)送delete請(qǐng)求
axios.post(url[, data[, config]])url:請(qǐng)求地址 data:發(fā)送請(qǐng)求體數(shù)據(jù) [config]:請(qǐng)求配置發(fā)送post請(qǐng)求
axios.put(url[, data[, config]])url:請(qǐng)求地址 data:發(fā)送請(qǐng)求體數(shù)據(jù) [config]:請(qǐng)求配置發(fā)送put請(qǐng)求

屬性列表

屬性描述
axios.defaults['xxx']默認(rèn)設(shè)置 。值為請(qǐng)求配置 [config] 中的配置項(xiàng) 例如 axios.defaults.headers 獲取頭部信息
axios.interceptors攔截器。參考 [攔截器] 的使用

使用示例

使用前在demo中entry-->src-->main-->ets-->common-->Common.ets文件中改為正確的服務(wù)器地址,在entry-->src-->main-->resources-->rawfile目錄下添加正確的證書,才可正常的使用demo。

發(fā)起一個(gè) GET 請(qǐng)求

axios支持泛型參數(shù),由于ArkTS不再支持any類型,需指定參數(shù)的具體類型。 如:axios.get(url)

  • T: 是響應(yīng)數(shù)據(jù)類型。當(dāng)發(fā)送一個(gè) POST 請(qǐng)求時(shí),客戶端可能會(huì)收到一個(gè) JSON 對(duì)象。T 就是這個(gè) JSON 對(duì)象的類型。默認(rèn)情況下,T 是 any,這意味著可以接收任何類型的數(shù)據(jù)。
  • R: 是響應(yīng)體的類型。當(dāng)服務(wù)器返回一個(gè)響應(yīng)時(shí),響應(yīng)體通常是一個(gè) JSON 對(duì)象。R 就是這個(gè) JSON 對(duì)象的類型。默認(rèn)情況下,R 是 AxiosResponse,這意味著響應(yīng)體是一個(gè) AxiosResponse 對(duì)象,它的 data 屬性是 T 類型的
  • D: 是請(qǐng)求參數(shù)的類型。當(dāng)發(fā)送一個(gè) GET 請(qǐng)求時(shí),可能會(huì)在 URL 中添加一些查詢參數(shù)。D 就是這些查詢參數(shù)的類型。參數(shù)為空情況下,D 是 null類型。
import axios from '@ohos/axios'
interface userInfo{
  id: number
  name: string,
  phone: number
}

// 向給定ID的用戶發(fā)起請(qǐng)求
axios.get< userInfo, AxiosResponse< userInfo >, null >('/user?ID=12345')
.then((response: AxiosResponse< userInfo >)= > {
  // 處理成功情況
  console.info("id" + response.data.id)
  console.info(JSON.stringify(response));
})
.catch((error: AxiosError)= > {
  // 處理錯(cuò)誤情況
  console.info(JSON.stringify(error));
})
.then(()= > {
  // 總是會(huì)執(zhí)行
});

// 上述請(qǐng)求也可以按以下方式完成(可選)
axios.get< userInfo, AxiosResponse< userInfo >, null >('/user', {
  params: {
    ID: 12345
  }
})
.then((response:AxiosResponse< userInfo >) = > {
  console.info("id" + response.data.id)
  console.info(JSON.stringify(response));
})
.catch((error:AxiosError) = > {
  console.info(JSON.stringify(error));
})
.then(() = > {
  // 總是會(huì)執(zhí)行
});

// 支持async/await用法
async function getUser() {
  try {
        const response:AxiosResponse = await axios.get< string, AxiosResponse< string >, null >(this.getUrl);
        console.log(JSON.stringify(response));
      } catch (error) {
    console.error(JSON.stringify(error));
  }
}

發(fā)送一個(gè) POST 請(qǐng)求

interface user {
  firstName: string,
  lastName: string
}
   axios.post< string, AxiosResponse< string >, user >('/user', {
     firstName: 'Fred',
     lastName: 'Flintstone'
   })
   .then((response: AxiosResponse< string >) = > {
     console.info(JSON.stringify(response));
   })
   .catch((error) = > {
  console.info(JSON.stringify(error));
});

發(fā)起多個(gè)并發(fā)請(qǐng)求

const getUserAccount = ():Promise< AxiosResponse > = > {
      return axios.get< string, AxiosResponse< string >, null >('/user/12345');
    }

 const getUserPermissions = ():Promise< AxiosResponse > = > {
      return axios.get< string, AxiosResponse< string >, null >('/user/12345/permissions');
    }

 Promise.all< AxiosResponse >([getUserAccount(), getUserPermissions()])
 .then((results:AxiosResponse[]) = > {
        const acct = results[0].data as string;
        const perm = results[1].data as string;
      });

使用說明

axios API

通過向 axios 傳遞相關(guān)配置來(lái)創(chuàng)建請(qǐng)求

axios(config)
// 發(fā)送一個(gè)get請(qǐng)求
axios< string, AxiosResponse< string >, null >({
  method: "get",
  url: 'https://www.xxx.com/info'
}).then((res: AxiosResponse) = > {
  console.info('result:' + JSON.stringify(res.data));
}).catch((error: AxiosError) = > {
  console.error(error.message);
})
axios(url[, config])
// 發(fā)送一個(gè)get請(qǐng)求(默認(rèn)請(qǐng)求方式)
axios.get< string, AxiosResponse< string >, null >('https://www.xxx.com/info', { params: { key: "value" } })
.then((response: AxiosResponse) = > {
  console.info("result:" + JSON.stringify(response.data));
})
.catch((error: AxiosError) = > {
  console.error("result:" + error.message);
});

請(qǐng)求方法的 別名方式 來(lái)創(chuàng)建請(qǐng)求

為方便起見,為所有支持的請(qǐng)求方法提供了別名。

  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])

注意: 在使用別名方法時(shí), url、method、data 這些屬性都不必在配置中指定。

// 發(fā)送get請(qǐng)求
axios.get< string, AxiosResponse< string >, null >('https://www.xxx.com/info', { params: { key: "value" } })
.then((response: AxiosResponse) = > {
  console.info("result:" + JSON.stringify(response.data));
})
.catch((error: AxiosError) = > {
  console.error("result:" + error.message);
});

axios 實(shí)例

創(chuàng)建一個(gè)實(shí)例

您可以使用自定義配置新建一個(gè)實(shí)例。
axios.create([config])

const instance = axios.create({
  baseURL: 'https://www.xxx.com/info',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

實(shí)例方法

  • axios#request(config)
  • axios#get(url[, config])
  • axios#delete(url[, config])
  • axios#post(url[, data[, config]])
  • axios#put(url[, data[, config]])

)請(qǐng)求配置

這些是創(chuàng)建請(qǐng)求時(shí)可以用的配置選項(xiàng)。只有 url 是必需的。如果沒有指定 method,請(qǐng)求將默認(rèn)使用 get 方法。

{
  // `url` 是用于請(qǐng)求的服務(wù)器 URL
  url: '/user',
  
  // `method` 是創(chuàng)建請(qǐng)求時(shí)使用的方法 支持post/get/put/delete方法,不區(qū)分大小寫,默認(rèn)為get方法
  method: 'get', // default
  
  // `baseURL` 將自動(dòng)加在 `url` 前面,除非 `url` 是一個(gè)絕對(duì) URL。
  // 它可以通過設(shè)置一個(gè) `baseURL` 便于為 axios 實(shí)例的方法傳遞相對(duì) URL
  baseURL: 'https://www.xxx.com/info',
  
  // `transformRequest` 允許在向服務(wù)器發(fā)送前,修改請(qǐng)求數(shù)據(jù)
  // 它只能用于 'PUT', 'POST' 和 'PATCH' 這幾個(gè)請(qǐng)求方法
  // 數(shù)組中最后一個(gè)函數(shù)必須返回一個(gè)字符串, 一個(gè)Buffer實(shí)例,ArrayBuffer,F(xiàn)ormData,或 Stream
  // 你可以修改請(qǐng)求頭。
  transformRequest: [function (data, headers) {
    // 對(duì)發(fā)送的 data 進(jìn)行任意轉(zhuǎn)換處理
    return data;
  }],

  // `transformResponse` 在傳遞給 then/catch 前,允許修改響應(yīng)數(shù)據(jù)
  transformResponse: [function (data) {
    // 對(duì)接收的 data 進(jìn)行任意轉(zhuǎn)換處理
    return data;
  }],
  
  // `headers` 是即將被發(fā)送的自定義請(qǐng)求頭
  headers: {'Content-Type': 'application/json'},
  
  // `params` 是即將與請(qǐng)求一起發(fā)送的 URL 參數(shù)
  // 必須是一個(gè)無(wú)格式對(duì)象(plain object),其他對(duì)象如 URLSearchParams ,必須使用 paramsSerializer 進(jìn)行序列化
  params: {
    ID: 12345
  },
  
  // `paramsSerializer` 是一個(gè)負(fù)責(zé) `params` 序列化的函數(shù)
  paramsSerializer: function(params) {
    return params
  },
  
  // `data` 是作為請(qǐng)求主體被發(fā)送的數(shù)據(jù)
  // 只適用于這些請(qǐng)求方法 'PUT', 'POST', 和 'PATCH'
  // 在沒有設(shè)置 `transformRequest` 時(shí),必須是以下類型之一,其他類型使用 transformRequest 轉(zhuǎn)換處理
  // - string, plain object, ArrayBuffer
  data: {
    firstName: 'Fred'
  },
  
  // 發(fā)送請(qǐng)求體數(shù)據(jù)的可選語(yǔ)法
  // 請(qǐng)求方式 post
  // 只有 value 會(huì)被發(fā)送,key 則不會(huì)
  data: 'Country=Brasil&City=Belo Horizonte',
  
  // `timeout` 指定請(qǐng)求超時(shí)的毫秒數(shù)(0 表示無(wú)超時(shí)時(shí)間)
  // 如果請(qǐng)求超過 `timeout` 的時(shí)間,請(qǐng)求將被中斷
  timeout: 1000,
  
  // `adapter` 允許自定義處理請(qǐng)求,這使測(cè)試更加容易。
  // 返回一個(gè) promise 并提供一個(gè)有效的響應(yīng) (參見 lib/adapters/README.md)。
  adapter: function (config) {
    /* ... */
  },
  // 如果設(shè)置了此參數(shù),系統(tǒng)將使用用戶指定路徑的CA證書,(開發(fā)者需保證該路徑下CA證書的可訪問性),否則將使用系統(tǒng)預(yù)設(shè)CA證書,系統(tǒng)預(yù)設(shè)CA證書位置:/etc/ssl/certs/cacert.pem。證書路徑為沙箱映射路徑(開發(fā)者可通過Global.getContext().filesDir獲取應(yīng)用沙箱路徑)。
  caPath: '',

  // 客戶端證書的clientCert字段,包括4個(gè)屬性:
  // 客戶端證書(cert)、客戶端證書類型(certType)、證書私鑰(key)和密碼短語(yǔ)(keyPasswd)。
  clientCert:{
      certPath: '',  // 客戶端證書路徑
      certType: '',  // 客戶端證書類型,包括pem、der、p12三種
      keyPath: '',   // 證書私鑰路徑
      keyPasswd: ''  // 密碼短語(yǔ)
  }

  // 優(yōu)先級(jí),范圍[1,1000],默認(rèn)是1,值越大,優(yōu)先級(jí)越高;
  priority: 1,

  //  `responseType` 指定返回?cái)?shù)據(jù)的類型,默認(rèn)無(wú)此字段。如果設(shè)置了此參數(shù),系統(tǒng)將優(yōu)先返回指定的類型。
  // 選項(xiàng)包括: string:字符串類型; object:對(duì)象類型; array_buffer:二進(jìn)制數(shù)組類型。
  responseType: 'string', 

  //  `proxy`
  // 是否使用HTTP代理,默認(rèn)為false,不使用代理。
  // 當(dāng)proxy為AxiosProxyConfig類型時(shí),使用指定網(wǎng)絡(luò)代理。
  proxy: {
      host: 'xx', // Host port
      port: xx, // Host port
      exclusionList: [] // Do not use a blocking list for proxy servers
  }
  
  // `onUploadProgress` 允許為上傳處理進(jìn)度事件
  onUploadProgress: function (progressEvent) {
    // 對(duì)原生進(jìn)度事件的處理
  },
  
  // `onDownloadProgress` 允許為下載處理進(jìn)度事件,下載文件必須設(shè)置該事件
  onDownloadProgress: function (progressEvent) {
    // 對(duì)原生進(jìn)度事件的處理
  },
  
  // 基于應(yīng)用程序的上下文,只適用于上傳/下載請(qǐng)求
  context: context,
  
  // 下載路徑。此參數(shù),只適用于下載請(qǐng)求,
  // Stage模型下使用AbilityContext 類獲取文件路徑,比如:'${getContext(this).cacheDir}/test.txt’并將文件存儲(chǔ)在此路徑下
  filePath: context,
  }

響應(yīng)結(jié)構(gòu)

一個(gè)請(qǐng)求的響應(yīng)包含以下信息。

{
  // `data` 由服務(wù)器提供的響應(yīng)
  data: {},

  // `status` 來(lái)自服務(wù)器響應(yīng)的 HTTP 狀態(tài)碼
  status: 200,

  // `statusText` 來(lái)自服務(wù)器響應(yīng)的 HTTP 狀態(tài)信息
  statusText: 'OK',

  // `headers` 是服務(wù)器響應(yīng)頭
  // 所有的 header 名稱都是小寫,而且可以使用方括號(hào)語(yǔ)法訪問
  // 例如: `response.headers['content-type']`
  headers: {},

  // `config``axios` 請(qǐng)求的配置信息
  config: {},
  
  // `request` 是生成此響應(yīng)的請(qǐng)求
  request: {}
}

當(dāng)使用 then 時(shí),您將接收如下響應(yīng):

axios.get< string, AxiosResponse< string >, null >(this.getUrl)
 .then( (response:AxiosResponse< string >)= > {
   console.log("result data: " + response.data);
   console.log("result status: " + response.status);
   console.log("result statusText: " + response.statusText);
   console.log("result headers: " + response.headers);
   console.log("result config: " + response.config);
 });

默認(rèn)配置

您可以指定默認(rèn)配置,它將作用于每個(gè)請(qǐng)求。

全局 axios 默認(rèn)值

axios.defaults.baseURL = 'https://www.xxx.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

自定義實(shí)例默認(rèn)值

// 創(chuàng)建實(shí)例時(shí)配置默認(rèn)值
const instance = axios.create({
  baseURL: 'https://www.xxx.com'
});

// 創(chuàng)建實(shí)例后修改默認(rèn)值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

配置的優(yōu)先級(jí) 配置將會(huì)按優(yōu)先級(jí)進(jìn)行合并。它的順序是:在lib/defaults.js中找到的庫(kù)默認(rèn)值,然后是實(shí)例的 defaults 屬性,最后是請(qǐng)求的 config 參數(shù)。后面的優(yōu)先級(jí)要高于前面的。下面有一個(gè)例子。

// 使用庫(kù)提供的默認(rèn)配置創(chuàng)建實(shí)例
// 此時(shí)超時(shí)配置的默認(rèn)值是 `0`
const instance = axios.create();

// 重寫庫(kù)的超時(shí)默認(rèn)值
// 現(xiàn)在,所有使用此實(shí)例的請(qǐng)求都將等待2.5秒,然后才會(huì)超時(shí)
instance.defaults.timeout = 2500;

// 重寫此請(qǐng)求的超時(shí)時(shí)間,因?yàn)樵撜?qǐng)求需要很長(zhǎng)時(shí)間
instance.get< string, AxiosResponse< string >, null >(this.getUrl, {
  timeout: 5000
})

攔截器

在請(qǐng)求或響應(yīng)被 then 或 catch 處理前攔截它們。

// 添加請(qǐng)求攔截器
axios.interceptors.request.use((config:InternalAxiosRequestConfig) = > {
  // 對(duì)請(qǐng)求數(shù)據(jù)做點(diǎn)什么
  return config;
}, (error:AxiosError) = > {
  // 對(duì)請(qǐng)求錯(cuò)誤做些什么
  return Promise.reject(error);
});


// 添加響應(yīng)攔截器
axios.interceptors.response.use((response:AxiosResponse)= > {
  // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
  return response;
}, (error:AxiosError)= > {
  // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
  return Promise.reject(error);
});

移除攔截器

const myInterceptor = axios.interceptors.request.use((response: AxiosResponse)= > {/*...*/});
axios.interceptors.request.eject(myInterceptor);

可以給自定義的 axios 實(shí)例添加攔截器

const instance = axios.create();
instance.interceptors.request.use((config:InternalAxiosRequestConfig)= > {/*...*/});

指定返回?cái)?shù)據(jù)的類型

responseType 指定返回?cái)?shù)據(jù)的類型,默認(rèn)無(wú)此字段。如果設(shè)置了此參數(shù),系統(tǒng)將優(yōu)先返回指定的類型。 選項(xiàng)包括: string:字符串類型; object:對(duì)象類型; array_buffer:二進(jìn)制數(shù)組類型。 設(shè)置responseType后,response.data中的數(shù)據(jù)將為指定類型

axios< string, AxiosResponse< string >, null >({
    url: 'https://www.xxx.com/info',
    method: 'get',
    responseType: 'array_buffer', 
  }).then((res: AxiosResponse) = > {
   // 處理請(qǐng)求成功的邏輯
  })

注意:也可以通過重寫transformResponse方法,修改返回?cái)?shù)據(jù);

axios< string, AxiosResponse< string >, null >({
    url: 'https://www.xxx.com/info',
    method: 'get',
    responseType: 'array_buffer', 
    transformResponse:(data)= >{
      return data
    }
  }).then((res: AxiosResponse) = > {
   // 處理請(qǐng)求成功的邏輯
  })

自定義ca證書

axios< infoModel, AxiosResponse< infoModel >, null >({
    url: 'https://www.xxx.com/xx',
    method: 'get',
    caPath: '', //ca證書路徑
  }).then((res: AxiosResponse) = > {
    // 
  }).catch((err: AxiosError) = > {
    //
  })

自定義客戶端證書

axios< infoModel, AxiosResponse< infoModel >, null >({
    url: 'https://www.xxx.com/xx',
    method: 'get',
    caPath: '', //ca證書路徑
    clientCert: {
        certPath: '', //客戶端證書路徑
        certType: 'p12', // 客戶端證書類型,包括pem、der、p12三種
        keyPath: '', //客戶端私鑰路徑
        keyPasswd: '' // 密碼
      }
  }).then((res: AxiosResponse) = > {
    // 
  }).catch((err: AxiosError) = > {
    //
  })

設(shè)置代理

axios< string, AxiosResponse< string >, null >({
      url: 'xxx',
      method: 'get',
      proxy:{
        host: 'xxx',
        port: xx,
        exclusionList: []
      }
    }).then((res: AxiosResponse) = > {
      // 
    }).catch((err: AxiosError) = > {
      //
    })

證書鎖定

證書鎖定的用法如下:

需要在配置文件中對(duì)證書進(jìn)行相關(guān)信息的配置:配置文件路徑為:entry/src/main/resources/base/profile/network_config.json

配置文件:network_config

{
  "network-security-config": {
    "domain-config": [
      {
        "domains": [
          {
            "include-subdomains": true,
            "name": "x.x.x.x"  // ip地址或域名
          }
        ],
        "pin-set": {
          "expiration": "2024-8-6", //證書鎖定的有效期
          "pin": [
            {
              "digest-algorithm": "sha256", //消息摘要的哈希算法,支持格式是sha256 
              "digest": "WAFcHG6pAINrztx343ccddfzLOdfoDS9pPgMv2XHk=" //消息摘要
            }
          ]
        }
      }
    ]
  }
}

digest字段消息摘要獲取

使用openssl從服務(wù)器獲取證書,并提取出消息摘要

openssl s_client -connect host:port 2 >&1 < /dev/null 
                    | sed -n '/-----BEGIN/,/-----END/p' 
                    | openssl x509 -noout -pubkey 
                    | openssl pkey -pubin -outform der 
                    | openssl dgst -sha256 -binary 
                    | openssl enc -base64

上傳下載文件

上傳文件示例

  • 上傳文件需要單獨(dú)導(dǎo)入FormData模塊
  • 當(dāng)前版本只支持 Stage 模型
  • 上傳類型支持uri和ArrayBuffer,uri支持“internal”協(xié)議類型,僅支持"internal"協(xié)議類型,"internal://cache/"為必填字段,示例: internal://cache/path/to/file.txt
  • 請(qǐng)求的表單數(shù)據(jù)值為string類型
當(dāng)上傳的內(nèi)容為ArrayBuffer時(shí),用法如下
import axios from '@ohos/axios'
import { FormData } from '@ohos/axios'
import fs from '@ohos.file.fs';

// ArrayBuffer
let formData = new FormData()
let cacheDir = getContext(this).cacheDir
try {
  // 寫入
  let path = cacheDir + '/hello.txt';
  let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
  fs.writeSync(file.fd, "hello, world"); // 以同步方法將數(shù)據(jù)寫入文件
  fs.fsyncSync(file.fd); // 以同步方法同步文件數(shù)據(jù)。
  fs.closeSync(file.fd);

  // 讀取
  let file2 = fs.openSync(path, 0o2);
  let stat = fs.lstatSync(path);
  let buf2 = new ArrayBuffer(stat.size);
  fs.readSync(file2.fd, buf2); // 以同步方法從流文件讀取數(shù)據(jù)。
  fs.fsyncSync(file2.fd);
  fs.closeSync(file2.fd);

  formData.append('file', buf2);
} catch (err) {
  console.info('err:' + JSON.stringify(err));
}
// 發(fā)送請(qǐng)求
axios.post< string, AxiosResponse< string >, FormData >(this.uploadUrl, formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  context: getContext(this),
  onUploadProgress: (progressEvent: AxiosProgressEvent): void = > {
  console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
},
}).then((res: AxiosResponse) = > {
  console.info("result" + JSON.stringify(res.data));
}).catch((error: AxiosError) = > {
  console.error("error:" + JSON.stringify(error));
})
當(dāng)上傳的uri時(shí),用法如下
import axios from '@ohos/axios'
import { FormData } from '@ohos/axios'

let formData = new FormData()
formData.append('file', 'internal://cache/blue.jpg')

// 發(fā)送請(qǐng)求
axios.post< string, AxiosResponse< string >, FormData >('https://www.xxx.com/upload', formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  context: getContext(this),
  onUploadProgress: (progressEvent: AxiosProgressEvent): void = > {
    console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
  },
}).then((res: AxiosResponse< string >) = > {
  console.info("result" + JSON.stringify(res.data));
}).catch((err: AxiosError) = > {
  console.error("error:" + JSON.stringify(err));
})

下載文件示例

設(shè)置下載路徑filePath(默認(rèn)在'internal://cache/'路徑下)。

關(guān)于filePath
filePath:'workspace/test.txt':默認(rèn)路徑下創(chuàng)建workspace路徑,并將文件存儲(chǔ)在workspace路徑下。
filePath:'test.txt':將文件存儲(chǔ)在默認(rèn)路徑下。
filePath:'workspace/':默認(rèn)路徑下創(chuàng)建workspace路徑,并將文件存儲(chǔ)在workspace路徑下。

  • 當(dāng)前版本只支持 Stage 模型 下載文件時(shí),如果filePath已存在該文件則下載失敗,下載之前需要先刪除文件。
let filePath = getContext(this).cacheDir + '/blue.jpg'
// 下載。如果文件已存在,則先刪除文件。
try {
  fs.accessSync(filePath);
  fs.unlinkSync(filePath);
} catch(err) {}

axios({
  url: 'https://www.xxx.com/blue.jpg',
  method: 'get',
  context: getContext(this),
  filePath: filePath ,
  onDownloadProgress: (progressEvent: AxiosProgressEvent): void = > {
    console.info("progress: " + progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) : 0)
  }
}).then((res)= >{
  console.info("result: " + JSON.stringify(res.data));
}).catch((error)= >{
  console.error("error:" + JSON.stringify(error));
})

錯(cuò)誤處理

錯(cuò)誤處理示例代碼

axios.get< string, AxiosResponse< string >, null >('/user/12345')
  .catch((error:AxiosError)= > {
    console.log(JSON.stringify(error.message));
    console.log(JSON.stringify(error.code));
    console.log(JSON.stringify(error.config));
  });

錯(cuò)誤碼

  • 網(wǎng)絡(luò)請(qǐng)求異常時(shí),catch方法接收到異常,異常錯(cuò)誤碼 [請(qǐng)點(diǎn)擊查看]
  • 錯(cuò)誤常量
名稱參數(shù)類型可讀可寫說明
NETWORK_MOBILEnumber使用蜂窩網(wǎng)絡(luò)時(shí)允許下載的位標(biāo)志。
NETWORK_WIFInumber使用WLAN時(shí)允許下載的位標(biāo)志。
ERROR_CANNOT_RESUME7+number某些臨時(shí)錯(cuò)誤導(dǎo)致的恢復(fù)下載失敗。
ERROR_DEVICE_NOT_FOUND7+number找不到SD卡等存儲(chǔ)設(shè)備。
ERROR_FILE_ALREADY_EXISTS7+number要下載的文件已存在,下載會(huì)話不能覆蓋現(xiàn)有文件。
ERROR_FILE_ERROR7+number文件操作失敗。
ERROR_HTTP_DATA_ERROR7+numberHTTP傳輸失敗。
ERROR_INSUFFICIENT_SPACE7+number存儲(chǔ)空間不足。
ERROR_TOO_MANY_REDIRECTS7+number網(wǎng)絡(luò)重定向過多導(dǎo)致的錯(cuò)誤。
ERROR_UNHANDLED_HTTP_CODE7+number無(wú)法識(shí)別的HTTP代碼。
ERROR_UNKNOWN7+number未知錯(cuò)誤。
PAUSED_QUEUED_FOR_WIFI7+number下載被暫停并等待WLAN連接,因?yàn)槲募笮〕^了使用蜂窩網(wǎng)絡(luò)的會(huì)話允許的最大值。
PAUSED_UNKNOWN7+number未知原因?qū)е聲和O螺d。
PAUSED_WAITING_FOR_NETWORK7+number由于網(wǎng)絡(luò)問題(例如網(wǎng)絡(luò)斷開)而暫停下載。
PAUSED_WAITING_TO_RETRY7+number發(fā)生網(wǎng)絡(luò)錯(cuò)誤,將重試下載會(huì)話。
SESSION_FAILED7+number下載會(huì)話已失敗,將不會(huì)重試。
SESSION_PAUSED7+number下載會(huì)話已暫停。
SESSION_PENDING7+number正在調(diào)度下載會(huì)話。
SESSION_RUNNING7+number下載會(huì)話正在進(jìn)行中。
SESSION_SUCCESSFUL7+number下載會(huì)話已完成。

鴻蒙開發(fā)知識(shí)更新在[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]前往參考。

鴻蒙開發(fā)OpenHarmony就業(yè)必修技能.png

約束與限制

在下述版本驗(yàn)證通過: DevEco Studio: 4.1 Canary2(4.1.3.325), SDK: API11(4.1.0.36)

注意:除雙向證書驗(yàn)證及證書鎖定功能必須使用API11外,其余功能支持API9、API10

FAQ

  • 服務(wù)器返回多個(gè)cookie,response.header中只能讀取首個(gè)cookie。
    由于該庫(kù)底層依賴ohos.net.http模塊,ohos.net.http也存在此問題,204.1.0.33 鏡像版本已修復(fù)此問題。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9160

    瀏覽量

    85421
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2352

    瀏覽量

    42858
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開發(fā):【短信服務(wù)】

    、OpenHarmony 多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(Harmony NEXT) 技術(shù)知識(shí)點(diǎn) 如果你是一名An
    發(fā)表于 03-03 21:29

    鴻蒙Flutter實(shí)戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實(shí)戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    鴻蒙Flutter實(shí)戰(zhàn):14-現(xiàn)有Flutter 項(xiàng)目支持鴻蒙 II

    ,職責(zé)分離,平臺(tái)抽象,不同平臺(tái)組合打包,有效解決平臺(tái)不一致問題 參考資料 鴻蒙Flutter實(shí)戰(zhàn):01-搭建開發(fā)環(huán)境 鴻蒙Flutter實(shí)戰(zhàn)
    發(fā)表于 12-26 14:59

    鴻蒙JS開發(fā)接口請(qǐng)求loading怎么解決?

    鴻蒙JS開發(fā)接口請(qǐng)求loading?
    發(fā)表于 05-10 10:24

    鴻蒙應(yīng)用開發(fā)請(qǐng)求不到數(shù)據(jù)是為什么?

    鴻蒙應(yīng)用開發(fā)請(qǐng)求不到數(shù)據(jù)
    發(fā)表于 06-15 11:04

    網(wǎng)絡(luò)組件axios可以在OpenHarmony上使用了

    網(wǎng)絡(luò)組件axios可以在OpenHarmony上使用了什么是axios上古瀏覽器頁(yè)面在向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí),因?yàn)榉祷氐氖钦麄€(gè)頁(yè)面的數(shù)據(jù),頁(yè)面都會(huì)強(qiáng)制刷新一下,這對(duì)于用戶來(lái)講并不是很友好。
    發(fā)表于 08-29 12:11

    Android開發(fā)的各大網(wǎng)絡(luò)請(qǐng)求庫(kù)實(shí)際案例

    Android開發(fā)的 各大網(wǎng)絡(luò)請(qǐng)求庫(kù)的實(shí)際案例。
    發(fā)表于 09-14 20:21 ?4次下載

    鴻蒙應(yīng)用開發(fā)者使用的精美圖表庫(kù)控件

    該三方開源庫(kù)從github fork過來(lái),主要將底層接口調(diào)用的實(shí)現(xiàn)修改成鴻蒙接口的實(shí)現(xiàn),將三方庫(kù)鴻蒙化,供開發(fā)
    發(fā)表于 04-01 10:31 ?1次下載

    源碼分析從 import axios from &apos;axios&apos; 的執(zhí)行過程-1

    這兩篇文章我們看一下 axios 的相關(guān)知識(shí)。從 import axios from 'axios' 再到 axios 的內(nèi)部源碼,帶大家看一下經(jīng)典
    的頭像 發(fā)表于 03-01 10:01 ?1256次閱讀
    源碼分析從 import <b class='flag-5'>axios</b> from &apos;<b class='flag-5'>axios</b>&apos; 的執(zhí)行過程-1

    STM32庫(kù)開發(fā)實(shí)戰(zhàn)指南

    STM32庫(kù)開發(fā)實(shí)戰(zhàn)指南-劉火良,電子 epub格式,清晰非掃描
    發(fā)表于 10-27 16:25 ?21次下載

    OpenHarmony:使用網(wǎng)絡(luò)組件axios與Spring Boot進(jìn)行前后端交互

    這兩個(gè)函數(shù)是使用axios庫(kù)發(fā)起HTTP GET請(qǐng)求的函數(shù),用于與服務(wù)器進(jìn)行通信
    的頭像 發(fā)表于 01-22 17:35 ?719次閱讀
    OpenHarmony:使用<b class='flag-5'>網(wǎng)絡(luò)</b>組件<b class='flag-5'>axios</b>與Spring Boot進(jìn)行前后端交互

    鴻蒙OS封裝【axios 網(wǎng)絡(luò)請(qǐng)求】(類似Android的Okhttp3)

    HarmonyOS 封裝 axios 網(wǎng)絡(luò)請(qǐng)求 包含 token 類似Android Okhttp3
    的頭像 發(fā)表于 03-26 21:14 ?2709次閱讀

    鴻蒙OS開發(fā)實(shí)例:【窺探網(wǎng)絡(luò)請(qǐng)求

    HarmonyOS 平臺(tái)中使用網(wǎng)絡(luò)請(qǐng)求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申請(qǐng)網(wǎng)絡(luò)權(quán)限, 即 “ohos.permission.INTERNET” 本篇文章將嘗試使用
    的頭像 發(fā)表于 04-01 16:11 ?791次閱讀
    <b class='flag-5'>鴻蒙</b>OS<b class='flag-5'>開發(fā)</b>實(shí)例:【窺探<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>請(qǐng)求</b>】

    鴻蒙OS開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    應(yīng)用通過HTTP發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發(fā)表于 04-01 16:31 ?696次閱讀
    <b class='flag-5'>鴻蒙</b>OS<b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【<b class='flag-5'>網(wǎng)絡(luò)</b>管理HTTP數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>】

    鴻蒙OS開發(fā)實(shí)例:【HarmonyHttpClient】網(wǎng)絡(luò)框架

    鴻蒙上使用的Http網(wǎng)絡(luò)框架,里面包含純Java實(shí)現(xiàn)的HttpNet,類似okhttp使用,支持同步和異步兩種請(qǐng)求方式;還有鴻蒙版retrofit,和Android版Retrofit相
    的頭像 發(fā)表于 04-12 16:58 ?829次閱讀
    <b class='flag-5'>鴻蒙</b>OS<b class='flag-5'>開發(fā)</b>實(shí)例:【HarmonyHttpClient】<b class='flag-5'>網(wǎng)絡(luò)</b>框架
    主站蜘蛛池模板: 亚洲综合色dddd26| 老师下面好紧| 亚洲欧美日韩在线精品2021| 欧美日韩一区视频| 天天想夜夜操| 韩国最新三级网站在线播放| 天天干夜夜艹| 日美一级毛片| 欧美1314www伊人久久香网| 婷婷网址| 欧美视频一区二区三区四区| 日本人亚洲人成人| 天天操夜夜操狠狠操| 轻点太大了好深好爽h文| 欧美在线视频免费| 色视频免费在线| 中文字幕日本一区波多野不卡| 久久综合狠狠综合狠狠| 久久观看午夜精品| 亚洲高清国产拍精品影院| 丁香花在线视频| 69日本xxxxxxxxx内谢| 琪琪see色原网一区二区| 日日操夜夜操天天操| 中文字幕欧美日韩| 丁香婷婷九月| 亚洲免费在线观看视频| 免费高清在线爱做视频| 又粗又爽又色男女乱淫播放男女| www.欧美.com| 欧美午夜电影| 久操视频免费看| 四虎三级| 色五月情| 五月激情片| 天天干天天操天天爱| 伊人99在线| 午夜精品免费| 永久免费看mv网站入口| 综合视频网| 中文天堂最新版www|