ToB企服应用市场:ToB评测及商务社交产业平台

标题: 鸿蒙开辟实战:网络哀求库【axios】 [打印本页]

作者: 诗林    时间: 2024-6-22 13:00
标题: 鸿蒙开辟实战:网络哀求库【axios】
简介

[Axios] ,是一个基于 promise 的网络哀求库,可以运行 node.js 和浏览器中。本库基于[Axios]原库v1.3.4版本举行适配,使其可以运行在 OpenHarmony,并沿用其现有用法和特性。


下载安装

  1. ohpm install @ohos/axios
复制代码
必要权限

  1. ohos.permission.INTERNET
复制代码
接口和属性列表

接口列表
接口参数功能axios(config)[config]:哀求设置发送哀求axios.create(config)[config]:哀求设置创建实例axios.request(config)[config]:哀求设置发送哀求axios.get(url[, config])url:哀求地点 [config]:哀求设置发送get哀求axios.delete(url[, config])url:哀求地点 [config]:哀求设置发送delete哀求axios.post(url[, data[, config]])url:哀求地点 data:发送哀求体数据 [config]:哀求设置发送post哀求axios.put(url[, data[, config]])url:哀求地点 data:发送哀求体数据 [config]:哀求设置发送put哀求 属性列表
属性描述axios.defaults[‘xxx’]默认设置 。值为哀求设置 [config] 中的设置项 例如 axios.defaults.headers 获取头部信息axios.interceptors拦截器。参考 [拦截器] 的利用 利用示例

利用前在demo中entry–>src–>main–>ets–>common–>Common.ets文件中改为正确的服务器地点,在entry–>src–>main–>resources–>rawfile目录下添加正确的证书,才可正常的利用demo。
发起一个 GET 哀求
axios支持泛型参数,由于ArkTS不再支持any类型,需指定参数的具体类型。 如:axios.get<T = any, R = AxiosResponse, D = any>(url)

  1. import axios from '@ohos/axios'
  2. interface userInfo{
  3.   id: number
  4.   name: string,
  5.   phone: number
  6. }
  7. // 向给定ID的用户发起请求
  8. axios.get<userInfo, AxiosResponse<userInfo>, null>('/user?ID=12345')
  9. .then((response: AxiosResponse<userInfo>)=> {
  10.   // 处理成功情况
  11.   console.info("id" + response.data.id)
  12.   console.info(JSON.stringify(response));
  13. })
  14. .catch((error: AxiosError)=> {
  15.   // 处理错误情况
  16.   console.info(JSON.stringify(error));
  17. })
  18. .then(()=> {
  19.   // 总是会执行
  20. });
  21. // 上述请求也可以按以下方式完成(可选)
  22. axios.get<userInfo, AxiosResponse<userInfo>, null>('/user', {
  23.   params: {
  24.     ID: 12345
  25.   }
  26. })
  27. .then((response:AxiosResponse<userInfo>) => {
  28.   console.info("id" + response.data.id)
  29.   console.info(JSON.stringify(response));
  30. })
  31. .catch((error:AxiosError) => {
  32.   console.info(JSON.stringify(error));
  33. })
  34. .then(() => {
  35.   // 总是会执行
  36. });
  37. // 支持async/await用法
  38. async function getUser() {
  39.   try {
  40.         const response:AxiosResponse = await axios.get<string, AxiosResponse<string>, null>(this.getUrl);
  41.         console.log(JSON.stringify(response));
  42.       } catch (error) {
  43.     console.error(JSON.stringify(error));
  44.   }
  45. }
复制代码
发送一个 POST 哀求
  1. interface user {
  2.   firstName: string,
  3.   lastName: string
  4. }
  5.    axios.post<string, AxiosResponse<string>, user>('/user', {
  6.      firstName: 'Fred',
  7.      lastName: 'Flintstone'
  8.    })
  9.    .then((response: AxiosResponse<string>) => {
  10.      console.info(JSON.stringify(response));
  11.    })
  12.    .catch((error) => {
  13.   console.info(JSON.stringify(error));
  14. });
复制代码
发起多个并发哀求
  1. const getUserAccount = ():Promise<AxiosResponse> => {
  2.       return axios.get<string, AxiosResponse<string>, null>('/user/12345');
  3.     }
  4. const getUserPermissions = ():Promise<AxiosResponse> => {
  5.       return axios.get<string, AxiosResponse<string>, null>('/user/12345/permissions');
  6.     }
  7. Promise.all<AxiosResponse>([getUserAccount(), getUserPermissions()])
  8. .then((results:AxiosResponse[]) => {
  9.         const acct = results[0].data as string;
  10.         const perm = results[1].data as string;
  11.       });
复制代码
利用说明

axios API

通过向 axios 通报干系设置来创建哀求

axios(config)

  1. // 发送一个get请求
  2. axios<string, AxiosResponse<string>, null>({
  3.   method: "get",
  4.   url: 'https://www.xxx.com/info'
  5. }).then((res: AxiosResponse) => {
  6.   console.info('result:' + JSON.stringify(res.data));
  7. }).catch((error: AxiosError) => {
  8.   console.error(error.message);
  9. })
复制代码
axios(url[, config])

  1. // 发送一个get请求(默认请求方式)
  2. axios.get<string, AxiosResponse<string>, null>('https://www.xxx.com/info', { params: { key: "value" } })
  3. .then((response: AxiosResponse) => {
  4.   console.info("result:" + JSON.stringify(response.data));
  5. })
  6. .catch((error: AxiosError) => {
  7.   console.error("result:" + error.message);
  8. });
复制代码
哀求方法的 别名方式 来创建哀求

为方便起见,为全部支持的哀求方法提供了别名。

   留意: 在利用别名方法时, url、method、data 这些属性都不必在设置中指定。
  1. // 发送get请求
  2. axios.get<string, AxiosResponse<string>, null>('https://www.xxx.com/info', { params: { key: "value" } })
  3. .then((response: AxiosResponse) => {
  4.   console.info("result:" + JSON.stringify(response.data));
  5. })
  6. .catch((error: AxiosError) => {
  7.   console.error("result:" + error.message);
  8. });
复制代码
axios 实例

创建一个实例

您可以利用自定义设置新建一个实例。
axios.create([config])
  1. const instance = axios.create({
  2.   baseURL: 'https://www.xxx.com/info',
  3.   timeout: 1000,
  4.   headers: {'X-Custom-Header': 'foobar'}
  5. });
复制代码
实例方法


)哀求设置

这些是创建哀求时可以用的设置选项。只有 url 是必需的。如果没有指定 method,哀求将默认利用 get 方法。
  1. {
  2.   // `url` 是用于请求的服务器 URL
  3.   url: '/user',
  4.   
  5.   // `method` 是创建请求时使用的方法 支持post/get/put/delete方法,不区分大小写,默认为get方法
  6.   method: 'get', // default
  7.   
  8.   // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  9.   // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  10.   baseURL: 'https://www.xxx.com/info',
  11.   
  12.   // `transformRequest` 允许在向服务器发送前,修改请求数据
  13.   // 它只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  14.   // 数组中最后一个函数必须返回一个字符串, 一个Buffer实例,ArrayBuffer,FormData,或 Stream
  15.   // 你可以修改请求头。
  16.   transformRequest: [function (data, headers) {
  17.     // 对发送的 data 进行任意转换处理
  18.     return data;
  19.   }],
  20.   // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  21.   transformResponse: [function (data) {
  22.     // 对接收的 data 进行任意转换处理
  23.     return data;
  24.   }],
  25.   
  26.   // `headers` 是即将被发送的自定义请求头
  27.   headers: {'Content-Type': 'application/json'},
  28.   
  29.   // `params` 是即将与请求一起发送的 URL 参数
  30.   // 必须是一个无格式对象(plain object),其他对象如 URLSearchParams ,必须使用 paramsSerializer 进行序列化
  31.   params: {
  32.     ID: 12345
  33.   },
  34.   
  35.   // `paramsSerializer` 是一个负责 `params` 序列化的函数
  36.   paramsSerializer: function(params) {
  37.     return params
  38.   },
  39.   
  40.   // `data` 是作为请求主体被发送的数据
  41.   // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  42.   // 在没有设置 `transformRequest` 时,必须是以下类型之一,其他类型使用 transformRequest 转换处理
  43.   // - string, plain object, ArrayBuffer
  44.   data: {
  45.     firstName: 'Fred'
  46.   },
  47.   
  48.   // 发送请求体数据的可选语法
  49.   // 请求方式 post
  50.   // 只有 value 会被发送,key 则不会
  51.   data: 'Country=Brasil&City=Belo Horizonte',
  52.   
  53.   // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  54.   // 如果请求超过 `timeout` 的时间,请求将被中断
  55.   timeout: 1000,
  56.   
  57.   // `adapter` 允许自定义处理请求,这使测试更加容易。
  58.   // 返回一个 promise 并提供一个有效的响应 (参见 lib/adapters/README.md)。
  59.   adapter: function (config) {
  60.     /* ... */
  61.   },
  62.   // 如果设置了此参数,系统将使用用户指定路径的CA证书,(开发者需保证该路径下CA证书的可访问性),否则将使用系统预设CA证书,系统预设CA证书位置:/etc/ssl/certs/cacert.pem。证书路径为沙箱映射路径(开发者可通过Global.getContext().filesDir获取应用沙箱路径)。
  63.   caPath: '',
  64.   // 客户端证书的clientCert字段,包括4个属性:
  65.   // 客户端证书(cert)、客户端证书类型(certType)、证书私钥(key)和密码短语(keyPasswd)。
  66.   clientCert:{
  67.       certPath: '',  // 客户端证书路径
  68.       certType: '',  // 客户端证书类型,包括pem、der、p12三种
  69.       keyPath: '',   // 证书私钥路径
  70.       keyPasswd: ''  // 密码短语
  71.   }
  72.   // 优先级,范围[1,1000],默认是1,值越大,优先级越高;
  73.   priority: 1,
  74.   //  `responseType` 指定返回数据的类型,默认无此字段。如果设置了此参数,系统将优先返回指定的类型。
  75.   // 选项包括: string:字符串类型; object:对象类型; array_buffer:二进制数组类型。
  76.   responseType: 'string',
  77.   //  `proxy`
  78.   // 是否使用HTTP代理,默认为false,不使用代理。
  79.   // 当proxy为AxiosProxyConfig类型时,使用指定网络代理。
  80.   proxy: {
  81.       host: 'xx', // Host port
  82.       port: xx, // Host port
  83.       exclusionList: [] // Do not use a blocking list for proxy servers
  84.   }
  85.   
  86.   // `onUploadProgress` 允许为上传处理进度事件
  87.   onUploadProgress: function (progressEvent) {
  88.     // 对原生进度事件的处理
  89.   },
  90.   
  91.   // `onDownloadProgress` 允许为下载处理进度事件,下载文件必须设置该事件
  92.   onDownloadProgress: function (progressEvent) {
  93.     // 对原生进度事件的处理
  94.   },
  95.   
  96.   // 基于应用程序的上下文,只适用于上传/下载请求
  97.   context: context,
  98.   
  99.   // 下载路径。此参数,只适用于下载请求,
  100.   // Stage模型下使用AbilityContext 类获取文件路径,比如:'${getContext(this).cacheDir}/test.txt’并将文件存储在此路径下
  101.   filePath: context,
  102.   }
复制代码
相应布局

一个哀求的相应包含以下信息。
  1. {
  2.   // `data` 由服务器提供的响应
  3.   data: {},
  4.   // `status` 来自服务器响应的 HTTP 状态码
  5.   status: 200,
  6.   // `statusText` 来自服务器响应的 HTTP 状态信息
  7.   statusText: 'OK',
  8.   // `headers` 是服务器响应头
  9.   // 所有的 header 名称都是小写,而且可以使用方括号语法访问
  10.   // 例如: `response.headers['content-type']`
  11.   headers: {},
  12.   // `config` 是 `axios` 请求的配置信息
  13.   config: {},
  14.   
  15.   // `request` 是生成此响应的请求
  16.   request: {}
  17. }
复制代码
当利用 then 时,您将吸收如下相应:
  1. axios.get<string, AxiosResponse<string>, null>(this.getUrl)
  2. .then( (response:AxiosResponse<string>)=> {
  3.    console.log("result data: " + response.data);
  4.    console.log("result status: " + response.status);
  5.    console.log("result statusText: " + response.statusText);
  6.    console.log("result headers: " + response.headers);
  7.    console.log("result config: " + response.config);
  8. });
复制代码
默认设置

您可以指定默认设置,它将作用于每个哀求。
全局 axios 默认值

  1. axios.defaults.baseURL = 'https://www.xxx.com';
  2. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  3. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
复制代码
自定义实例默认值

  1. // 创建实例时配置默认值
  2. const instance = axios.create({
  3.   baseURL: 'https://www.xxx.com'
  4. });
  5. // 创建实例后修改默认值
  6. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
复制代码
设置的优先级 设置将会按优先级举行归并。它的次序是:在lib/defaults.js中找到的库默认值,然后是实例的 defaults 属性,最后是哀求的 config 参数。背面的优先级要高于前面的。下面有一个例子。
  1. // 使用库提供的默认配置创建实例
  2. // 此时超时配置的默认值是 `0`
  3. const instance = axios.create();
  4. // 重写库的超时默认值
  5. // 现在,所有使用此实例的请求都将等待2.5秒,然后才会超时
  6. instance.defaults.timeout = 2500;
  7. // 重写此请求的超时时间,因为该请求需要很长时间
  8. instance.get<string, AxiosResponse<string>, null>(this.getUrl, {
  9.   timeout: 5000
  10. })
复制代码
拦截器

在哀求或相应被 then 或 catch 处理前拦截它们。
  1. // 添加请求拦截器
  2. axios.interceptors.request.use((config:InternalAxiosRequestConfig) => {
  3.   // 对请求数据做点什么
  4.   return config;
  5. }, (error:AxiosError) => {
  6.   // 对请求错误做些什么
  7.   return Promise.reject(error);
  8. });
  9. // 添加响应拦截器
  10. axios.interceptors.response.use((response:AxiosResponse)=> {
  11.   // 对响应数据做点什么
  12.   return response;
  13. }, (error:AxiosError)=> {
  14.   // 对响应错误做点什么
  15.   return Promise.reject(error);
  16. });
复制代码
移除拦截器
  1. const myInterceptor = axios.interceptors.request.use((response: AxiosResponse)=> {/*...*/});
  2. axios.interceptors.request.eject(myInterceptor);
复制代码
可以给自定义的 axios 实例添加拦截器
  1. const instance = axios.create();
  2. instance.interceptors.request.use((config:InternalAxiosRequestConfig)=> {/*...*/});
复制代码
指定返回数据的类型

responseType 指定返回数据的类型,默认无此字段。如果设置了此参数,系统将优先返回指定的类型。 选项包括: string:字符串类型; object:对象类型; array_buffer:二进制数组类型。 设置responseType后,response.data中的数据将为指定类型
  1. axios<string, AxiosResponse<string>, null>({
  2.     url: 'https://www.xxx.com/info',
  3.     method: 'get',
  4.     responseType: 'array_buffer',
  5.   }).then((res: AxiosResponse) => {
  6.    // 处理请求成功的逻辑
  7.   })
复制代码
  留意:也可以通过重写transformResponse方法,修改返回数据;
  1. axios<string, AxiosResponse<string>, null>({
  2.     url: 'https://www.xxx.com/info',
  3.     method: 'get',
  4.     responseType: 'array_buffer',
  5.     transformResponse:(data)=>{
  6.       return data
  7.     }
  8.   }).then((res: AxiosResponse) => {
  9.    // 处理请求成功的逻辑
  10.   })
复制代码
自定义ca证书

  1.   axios<infoModel, AxiosResponse<infoModel>, null>({
  2.     url: 'https://www.xxx.com/xx',
  3.     method: 'get',
  4.     caPath: '', //ca证书路径
  5.   }).then((res: AxiosResponse) => {
  6.     //
  7.   }).catch((err: AxiosError) => {
  8.     //
  9.   })
复制代码
自定义客户端证书

  1.   axios<infoModel, AxiosResponse<infoModel>, null>({
  2.     url: 'https://www.xxx.com/xx',
  3.     method: 'get',
  4.     caPath: '', //ca证书路径
  5.     clientCert: {
  6.         certPath: '', //客户端证书路径
  7.         certType: 'p12', // 客户端证书类型,包括pem、der、p12三种
  8.         keyPath: '', //客户端私钥路径
  9.         keyPasswd: '' // 密码
  10.       }
  11.   }).then((res: AxiosResponse) => {
  12.     //
  13.   }).catch((err: AxiosError) => {
  14.     //
  15.   })
复制代码
设置代理

  1.     axios<string, AxiosResponse<string>, null>({
  2.       url: 'xxx',
  3.       method: 'get',
  4.       proxy:{
  5.         host: 'xxx',
  6.         port: xx,
  7.         exclusionList: []
  8.       }
  9.     }).then((res: AxiosResponse) => {
  10.       //
  11.     }).catch((err: AxiosError) => {
  12.       //
  13.     })
复制代码
证书锁定

证书锁定的用法如下:
必要在设置文件中对证书举行干系信息的设置:设置文件路径为:entry/src/main/resources/base/profile/network_config.json
设置文件:network_config
  1. {
  2.   "network-security-config": {
  3.     "domain-config": [
  4.       {
  5.         "domains": [
  6.           {
  7.             "include-subdomains": true,
  8.             "name": "x.x.x.x"  // ip地址或域名
  9.           }
  10.         ],
  11.         "pin-set": {
  12.           "expiration": "2024-8-6", //证书锁定的有效期
  13.           "pin": [
  14.             {
  15.               "digest-algorithm": "sha256", //消息摘要的哈希算法,支持格式是sha256
  16.               "digest": "WAFcHG6pAINrztx343ccddfzLOdfoDS9pPgMv2XHk=" //消息摘要
  17.             }
  18.           ]
  19.         }
  20.       }
  21.     ]
  22.   }
  23. }
复制代码
digest字段消息摘要获取

利用openssl从服务器获取证书,并提取出消息摘要
  1. openssl s_client -connect host:port 2>&1 < /dev/null \
  2.                     | sed -n '/-----BEGIN/,/-----END/p' \
  3.                     | openssl x509 -noout -pubkey \
  4.                     | openssl pkey -pubin -outform der \
  5.                     | openssl dgst -sha256 -binary \
  6.                     | openssl enc -base64
复制代码
上传下载文件

上传文件示例


当上传的内容为ArrayBuffer时,用法如下

  1. import axios from '@ohos/axios'
  2. import { FormData } from '@ohos/axios'
  3. import fs from '@ohos.file.fs';
  4. // ArrayBuffer
  5. let formData = new FormData()
  6. let cacheDir = getContext(this).cacheDir
  7. try {
  8.   // 写入
  9.   let path = cacheDir + '/hello.txt';
  10.   let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
  11.   fs.writeSync(file.fd, "hello, world"); // 以同步方法将数据写入文件
  12.   fs.fsyncSync(file.fd); // 以同步方法同步文件数据。
  13.   fs.closeSync(file.fd);
  14.   // 读取
  15.   let file2 = fs.openSync(path, 0o2);
  16.   let stat = fs.lstatSync(path);
  17.   let buf2 = new ArrayBuffer(stat.size);
  18.   fs.readSync(file2.fd, buf2); // 以同步方法从流文件读取数据。
  19.   fs.fsyncSync(file2.fd);
  20.   fs.closeSync(file2.fd);
  21.   formData.append('file', buf2);
  22. } catch (err) {
  23.   console.info('err:' + JSON.stringify(err));
  24. }
  25. // 发送请求
  26. axios.post<string, AxiosResponse<string>, FormData>(this.uploadUrl, formData, {
  27.   headers: { 'Content-Type': 'multipart/form-data' },
  28.   context: getContext(this),
  29.   onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
  30.   console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
  31. },
  32. }).then((res: AxiosResponse) => {
  33.   console.info("result" + JSON.stringify(res.data));
  34. }).catch((error: AxiosError) => {
  35.   console.error("error:" + JSON.stringify(error));
  36. })
复制代码
当上传的uri时,用法如下

  1. import axios from '@ohos/axios'
  2. import { FormData } from '@ohos/axios'
  3. let formData = new FormData()
  4. formData.append('file', 'internal://cache/blue.jpg')
  5. // 发送请求
  6. axios.post<string, AxiosResponse<string>, FormData>('https://www.xxx.com/upload', formData, {
  7.   headers: { 'Content-Type': 'multipart/form-data' },
  8.   context: getContext(this),
  9.   onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
  10.     console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
  11.   },
  12. }).then((res: AxiosResponse<string>) => {
  13.   console.info("result" + JSON.stringify(res.data));
  14. }).catch((err: AxiosError) => {
  15.   console.error("error:" + JSON.stringify(err));
  16. })
复制代码
下载文件示例

设置下载路径filePath(默认在’internal://cache/'路径下)。
   关于filePath
filePath:‘workspace/test.txt’:默认路径下创建workspace路径,并将文件存储在workspace路径下。
filePath:‘test.txt’:将文件存储在默认路径下。
filePath:‘workspace/’:默认路径下创建workspace路径,并将文件存储在workspace路径下。
  
  1. let filePath = getContext(this).cacheDir + '/blue.jpg'
  2. // 下载。如果文件已存在,则先删除文件。
  3. try {
  4.   fs.accessSync(filePath);
  5.   fs.unlinkSync(filePath);
  6. } catch(err) {}
  7. axios({
  8.   url: 'https://www.xxx.com/blue.jpg',
  9.   method: 'get',
  10.   context: getContext(this),
  11.   filePath: filePath ,
  12.   onDownloadProgress: (progressEvent: AxiosProgressEvent): void => {
  13.     console.info("progress: " + progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) : 0)
  14.   }
  15. }).then((res)=>{
  16.   console.info("result: " + JSON.stringify(res.data));
  17. }).catch((error)=>{
  18.   console.error("error:" + JSON.stringify(error));
  19. })
复制代码
错误处理

错误处理示例代码

  1. axios.get<string, AxiosResponse<string>, null>('/user/12345')
  2.   .catch((error:AxiosError)=> {
  3.     console.log(JSON.stringify(error.message));
  4.     console.log(JSON.stringify(error.code));
  5.     console.log(JSON.stringify(error.config));
  6.   });
复制代码
错误码


名称参数类型可读可写说明NETWORK_MOBILEnumber是否利用蜂窝网络时允许下载的位标志。NETWORK_WIFInumber是否利用WLAN时允许下载的位标志。ERROR_CANNOT_RESUME7+number是否某些临时错误导致的恢复下载失败。ERROR_DEVICE_NOT_FOUND7+number是否找不到SD卡等存储装备。ERROR_FILE_ALREADY_EXISTS7+number是否要下载的文件已存在,下载会话不能覆盖现有文件。ERROR_FILE_ERROR7+number是否文件操作失败。ERROR_HTTP_DATA_ERROR7+number是否HTTP传输失败。ERROR_INSUFFICIENT_SPACE7+number是否存储空间不足。ERROR_TOO_MANY_REDIRECTS7+number是否网络重定向过多导致的错误。ERROR_UNHANDLED_HTTP_CODE7+number是否无法识别的HTTP代码。ERROR_UNKNOWN7+number是否未知错误。PAUSED_QUEUED_FOR_WIFI7+number是否下载被暂停并等候WLAN毗连,因为文件巨细凌驾了利用蜂窝网络的会话允许的最大值。PAUSED_UNKNOWN7+number是否未知原因导致暂停下载。PAUSED_WAITING_FOR_NETWORK7+number是否由于网络题目(例如网络断开)而暂停下载。PAUSED_WAITING_TO_RETRY7+number是否发生网络错误,将重试下载会话。SESSION_FAILED7+number是否下载会话已失败,将不会重试。SESSION_PAUSED7+number是否下载会话已暂停。SESSION_PENDING7+number是否正在调理下载会话。SESSION_RUNNING7+number是否下载会话正在举行中。SESSION_SUCCESSFUL7+number是否下载会话已完成。 鸿蒙开辟知识更新在gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md前去参考。


约束与限制

在下述版本验证通过: DevEco Studio: 4.1 Canary2(4.1.3.325), SDK: API11(4.1.0.36)
   留意:除双向证书验证及证书锁定功能必须利用API11外,其余功能支持API9、API10
  FAQ



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4