# axios
**Repository Path**: LLLLLLin/axios
## Basic Information
- **Project Name**: axios
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 101
- **Created**: 2022-08-29
- **Last Updated**: 2022-08-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# axios
## 简介
[Axios](https://github.com/axios/axios) ,是一个基于 promise 的网络请求库,可以运行 node.js 和浏览器中。本库基于[Axios](https://github.com/axios/axios) 原库进行适配,使其可以运行在 OpenHarmony,并沿用其现有用法和特性。
- http 请求
- Promise API
- request 和 response 拦截器
- 转换 request 和 response 的 data 数据
- 自动转换 JSON data 数据
## 下载安装
```javascript
npm install @ohos/axios --save
```
OpenHarmony npm 环境配置等更多内容,请参考[如何安装 OpenHarmony npm 包](https://gitee.com/openharmony-tpc/docs/blob/master/OpenHarmony_npm_usage.md)
## 使用说明
```javascript
import { axios } from '@ohos/axios'
```
## 需要权限
```
ohos.permission.INTERNET
```
### axios API
#### 通过向 axios 传递相关配置来创建请求
##### axios(config)
```javascript
axios({
method: "get",
url: 'http://www.xxx.com/info'
}).then(res => {
console.info('result:' + JSON.stringify(res.data));
}).catch(error => {
console.error(error);
})
```
##### axios(url[, config])
```javascript
axios('http://www.xxx.com/info').then(res => {
console.info('result:' + JSON.stringify(res.data));
}).catch(error => {
console.error(error);
})
```
#### 请求方法的 别名方式 来创建请求
为方便起见,为所有支持的请求方法提供了别名
- axios.request(config)
- axios.get(url[, config])
- axios.delete(url[, config])
- axios.post(url[, data[, config]])
- axios.put(url[, data[, config]])
代码示例:
```javascript
axios.get("http://www.xxx.com/info", { params: { key: "value" } })
.then(function (response) {
console.info("result:" + JSON.stringify(response.data));
})
.catch(function (error) {
console.error(error);
});
```
#### 请求配置
这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 get 方法。
```javascript
// `url` 是用于请求的服务器 URL
url: '/user',
// `method` 是创建请求时使用的方法 支持post/get/put/delete方法,不区分大小写,默认为get方法
method: 'get', // default
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: 'https://some-domain.com/api/',
// `headers` 是即将被发送的自定义请求头
headers: {'Content-Type': 'application/json'},
// `params` 是即将与请求一起发送的 URL 参数
// 必须是一个无格式对象(plain object)或 URLSearchParams 对象
params: {
ID: 12345
},
// `data` 是作为请求主体被发送的数据
// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
data: {
firstName: 'Fred'
},
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求超过 `timeout` 的时间,请求将被中断
timeout: 1000,
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
// `onDownloadProgress` 允许为下载处理进度事件
onDownloadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
```
#### 错误码
- 网络请求异常时,catch方法接收到异常,异常错误码 [请点击查看](https://curl.se/libcurl/c/libcurl-errors.html)
- 错误常量
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| NETWORK_MOBILE | number | 是 | 否 | 使用蜂窝网络时允许下载的位标志。 |
| NETWORK_WIFI | number | 是 | 否 | 使用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 | 是 | 否 | 下载会话已完成。 |
### GET 请求方法示例
```javascript
// 方式1,通过向 axios 传递相关配置来创建请求
axios({
method: "get",
url: 'http://www.xxx.com/info'
}).then(res => {
console.info('result:' + JSON.stringify(res.data));
}).catch(error => {
console.error(error);
})
// 方式2,通过别名来创建请求
axios.get("http://www.xxx.com/info", { params: { key: "value" } })
.then(function (response) {
console.info("result:" + JSON.stringify(response.data));
})
.catch(function (error) {
console.error(error);
});
```
### POST 请求方法示例
```javascript
axios({
url: 'http://www.xxx.com/post',
method: 'post',
data: {titleId: 2, typeId: 1},
}).then(res=>{
console.info('result: ' + JSON.stringify(res.data));
}).catch((error)=>{
console.info('error: ' + JSON.stringify(error));
})
```
### 上传文件示例
- 上传文件需要单独导入FormData模块
- 当前版本只支持 Stage 模型
- 上传类型支持uri和ArrayBuffer,uri支持“dataability”和“internal”两种协议类型,但“internal”仅支持临时目录, 示例: dataability:///com.domainname.dataability.persondata/person/10/file.txt ;internal://cache/path/to/file.txt
#### 当上传的内容为ArrayBuffer时,必须指定文件名,用法如下
```javascript
import { axios, FormData } from '@ohos/axios'
import fileio from '@ohos.fileio';
// ArrayBuffer
var formData = new FormData()
let cacheDir = (getContext(this) as any).cacheDir
try {
// 写入
let path = cacheDir + '/hello.txt';
let fd = fileio.openSync(path, 0o100 | 0o2, 0o666);
fileio.writeSync(fd, "hello, world");
fileio.fsyncSync(fd);
fileio.closeSync(fd);
// 读取
let fd2 = fileio.openSync(path, 0o2);
let stat = fileio.lstatSync(path);
let buf2 = new ArrayBuffer(stat.size);
fileio.readSync(fd2, buf2);
fileio.fsyncSync(fd2);
fileio.closeSync(fd2);
formData.append('file', buf2, 'hello.txt');
}catch(err){
console.info('err:' + JSON.stringify(err));
}
// 发送请求
axios.post('http://www.xxx.com/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
context: getContext(this),
onUploadProgress:(uploadedSize: number, total:number):void=> {
console.info(Math.ceil(uploadedSize/total * 100) + '%');
},
}).then((res) => {
console.info("result" + JSON.stringify(res.data));
}).catch(error => {
console.error("error:" + JSON.stringify(error));
})
```
#### 当上传的uri时,用法如下
```javascript
import { axios, FormData } from '@ohos/axios'
var formData = new FormData()
formData.append('file', 'internal://cache/blue.jpg')
// 发送请求
axios.post('http://www.xxx.com/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
context: getContext(this),
onUploadProgress:(uploadedSize: number, total:number):void=> {
console.info(Math.ceil(uploadedSize/total * 100) + '%');
},
}).then((res) => {
console.info("result" + JSON.stringify(res.data));
}).catch(error => {
console.error("error:" + JSON.stringify(error));
})
```
### 下载文件示例
设置下载路径filePath(默认在'internal://cache/'路径下)。
filePath:'workspace/test.txt':默认路径下创建workspace路径,并将文件存储在workspace路径下。
filePath:'test.txt':将文件存储在默认路径下。
filePath:'workspace/':默认路径下创建workspace路径,并将文件存储在workspace路径下。
- 当前版本只支持 Stage 模型
下载文件时,如果filePath已存在该文件则下载失败,下载之前需要先删除文件。
```javascript
let filePath = (getContext(this) as any).cacheDir + '/blue.jpg'
// 下载。如果文件已存在,则先删除文件。
try {
fileio.accessSync(filePath);
fileio.unlinkSync(filePath);
} catch(err) {}
axios({
url: 'http://www.xxx.com/blue.jpg',
method: 'get',
context: getContext(this),
filePath: filePath ,
onDownloadProgress: (receivedSize: number, total:number):void=> {
console.info(Math.ceil( receivedSize/total * 100 ) + '%');
},
}).then((res)=>{
console.info("result: " + JSON.stringify(res.data));
}).catch((error)=>{=
console.error(t"error:" + JSON.stringify(error));
})
```
### 拦截器示例
```javascript
// 添加请求拦截器
axios.interceptors.request.use(config => {
// 对请求数据做点什么
return config;
}, error => {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
```
### 默认设置示例
#### 全局axios默认值
```javascript
axios.defaults.baseURL = 'http://www.xxx.com';
axios.defaults.headers['Authorization'] = 'Admin-Token';
```
#### 自定义实例默认值
```javascript
const instance = axios.create({
baseURL: 'http://www.xxx.com',
timeout: 1000,
headers: {'Content-Type': 'application/json'}
});
```
## 已知bug
- 上传文件,服务器返回404/500等错误场景,onUploadProgress仍然可以监听到进度,并且进度有时可达到100%。
- 上传/下载文件,文件上传/下载成功,但有较小的概率进度达不到100%。
- 设置下载路径(filePath)地址不存在,axios catch不抛出异常信息。
## 8月22日前镜像可能存在的bug
- 下载文件,url非法,axios catch不抛出异常信息(已修复)。
- 下载,服务器返回404/500等错误场景,onDownloadProgress仍然可以监听到进度(已修复)。
## 兼容性
支持 OpenHarmony API version 9 及以上版本
## 目录结构
```javascript
|---- ohos_axios
| |---- entry # 示例代码文件夹
| |---- screenshots #截图
| |---- ohos_axios # ohos_axios 库文件夹
| |---- src # ohos_axios 网络请求核心代码
| |---- index.d.ts # ohos_axios 接口类型定义
| |---- index.js # ohos_axios 适配axios源码
| |---- README.MD # 安装使用方法
```
## 贡献代码
使用过程中发现任何问题都可以提[Issue](https://gitee.com/openharmony-tpc/ohos-axios/issues) 给我们,当然,我们也非常欢迎你给我们提[PR](https://gitee.com/openharmony-tpc/ohos-axios/pulls)。
## 开源协议
本项目基于 [Apache License 2.0](https://gitee.com/openharmony-tpc/ohos-axios/blob/master/LICENSE),请自由地享受和参与开源。