pull/1/head
954270063@qq.com 2020-04-19 16:30:38 +08:00
parent b1f5da385b
commit 7b82ba48dc
13 changed files with 137 additions and 100 deletions

View File

@ -93,8 +93,8 @@ npm i axios-miniprogram
```typescript ```typescript
axios('/test', { axios('/test', {
validateStatus: function validateStatus(status) { validateStatus: function validateStatus(status) {
// 这样,状态码在 100 到 400 之间都是请求成功 // 这样,状态码在 200 到 400 之间都是请求成功
return status >= 200 && status < 300; return status >= 200 && status < 400;
} }
}); });
``` ```
@ -130,7 +130,7 @@ axios('/test', {
##### `config.adapter`自定义平台适配器 ##### `config.adapter`自定义平台适配器
您可以自己适配您所在的平台 您可以手动适配当前所处的平台
```typescript ```typescript
axios.defaults.adapter = function adapter(adapterConfig) { axios.defaults.adapter = function adapter(adapterConfig) {
@ -166,7 +166,7 @@ axios.defaults.adapter = function adapter(adapterConfig) {
} = adapterConfig; } = adapterConfig;
// 在 adapterConfig 中选择您需要的参数发送请求 // 在 adapterConfig 中选择您需要的参数发送请求
wx.request({ return wx.request({
url, url,
method, method,
data, data,
@ -187,7 +187,7 @@ axios.defaults.adapter = wx.request;
```typescript ```typescript
axios.defaults.baseURL = 'https://www.xxx.com'; axios.defaults.baseURL = 'https://www.xxx.com';
axios.defaults.headers.common['Accept'] = 'application/json, test/plain, */*'; axios.defaults.headers.common['Accept'] = 'application/json, test/plain, */*';
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
``` ```
##### 自定义实例默认配置 ##### 自定义实例默认配置
@ -209,7 +209,7 @@ const instance = axios.create({
// 也可以创建后修改 // 也可以创建后修改
instance.defaults.baseURL = 'https://www.xxx.com'; instance.defaults.baseURL = 'https://www.xxx.com';
instance.defaults.headers.common['Accept'] = 'application/json, test/plain, */*'; instance.defaults.headers.common['Accept'] = 'application/json, test/plain, */*';
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
``` ```
##### 配置优先顺序 ##### 配置优先顺序
@ -224,8 +224,6 @@ instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlenco
|statusText|String|状态文本|是| |statusText|String|状态文本|是|
|data|String/Object/ArrayBuffer|开发者服务器返回的数据|是| |data|String/Object/ArrayBuffer|开发者服务器返回的数据|是|
|headers|Object|响应头|是| |headers|Object|响应头|是|
|response|Object|通用响应体|是|
|request|Object|通用请求配置|是|
|config|Object|Axios 请求配置|是| |config|Object|Axios 请求配置|是|
|cookies|Array<.String>|开发者服务器返回的 cookies格式为字符串数组| | |cookies|Array<.String>|开发者服务器返回的 cookies格式为字符串数组| |
|profile|Object|网络请求过程中一些关键时间点的耗时信息| | |profile|Object|网络请求过程中一些关键时间点的耗时信息| |

View File

@ -1,6 +1,6 @@
{ {
"name": "axios-miniprogram", "name": "axios-miniprogram",
"version": "1.0.5", "version": "1.0.6",
"description": "基于 Promise 的 HTTP 请求库,适用于各大小程序平台。", "description": "基于 Promise 的 HTTP 请求库,适用于各大小程序平台。",
"main": "package/index.js", "main": "package/index.js",
"miniprogram": "package", "miniprogram": "package",

View File

@ -2,9 +2,10 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-17 15:05:43 * @Date: 2020-04-17 15:05:43
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-18 15:51:02 * @LastEditTime: 2020-04-19 15:53:36
*/ */
import { Method, Data, Headers, AdapterMethod, AxiosRequestConfig, RequestConfig } from '../types'; import { Method, Data, Headers, AdapterMethod, AxiosRequestConfig, RequestConfig } from '../types';
import { pick } from '../helper/utils';
import transformURL from '../helper/transformURL'; import transformURL from '../helper/transformURL';
/** /**
@ -24,7 +25,7 @@ function methodUppercase(config: AxiosRequestConfig): AdapterMethod {
* @param config Axios * @param config Axios
*/ */
export default function requestConfigOk(config: AxiosRequestConfig): RequestConfig { export default function requestConfigOk(config: AxiosRequestConfig): RequestConfig {
const { headers, data, dataType, responseType, timeout, enableHttp2, enableQuic, enableCache, sslVerify } = config; const { headers, data } = config;
const url = transformURL(config); const url = transformURL(config);
const method = methodUppercase(config); const method = methodUppercase(config);
@ -34,12 +35,9 @@ export default function requestConfigOk(config: AxiosRequestConfig): RequestConf
header: headers as Headers, header: headers as Headers,
headers: headers as Headers, headers: headers as Headers,
data: data as Data, data: data as Data,
dataType, ...pick<
responseType, AxiosRequestConfig,
timeout, 'dataType' | 'responseType' | 'timeout' | 'enableHttp2' | 'enableQuic' | 'enableCache' | 'sslVerify'
enableHttp2, >(config, 'dataType', 'responseType', 'timeout', 'enableHttp2', 'enableQuic', 'enableCache', 'sslVerify'),
enableQuic,
enableCache,
sslVerify,
}; };
} }

View File

@ -2,9 +2,10 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-17 14:09:16 * @Date: 2020-04-17 14:09:16
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-18 16:03:37 * @LastEditTime: 2020-04-19 15:47:36
*/ */
import { RequestConfig, AxiosRequestConfig, AxiosResponse, Response } from '../types'; import { AxiosRequestConfig, AxiosResponse, Response } from '../types';
import { pick } from '../helper/utils';
/** /**
* Axios * Axios
@ -15,27 +16,16 @@ import { RequestConfig, AxiosRequestConfig, AxiosResponse, Response } from '../t
* @param request * @param request
* @param config Axios * @param config Axios
*/ */
export default function responseOk(response: Response, config: AxiosRequestConfig): AxiosResponse {
export default function responseOk( const status = response.status ?? response.statusCode;
response: Response, const headers = response.headers ?? response.header;
request: RequestConfig,
config: AxiosRequestConfig
): AxiosResponse {
response.status = response.status ?? response.statusCode;
response.headers = response.headers ?? response.header;
const { status, headers, data, cookies, profile } = response;
const statusText = status === 200 ? 'OK' : status === 400 ? 'Bad Adapter' : ''; const statusText = status === 200 ? 'OK' : status === 400 ? 'Bad Adapter' : '';
return { return {
status, status,
statusText, statusText,
headers, headers,
data,
response,
request,
config, config,
cookies, ...pick<Response, 'data' | 'cookies' | 'profile'>(response, 'data', 'cookies', 'profile'),
profile,
}; };
} }

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-15 17:50:50 * @Date: 2020-04-15 17:50:50
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 02:22:28 * @LastEditTime: 2020-04-19 13:35:47
*/ */
import { import {
InterceptorResolved, InterceptorResolved,
@ -24,7 +24,7 @@ export default class InterceptorManagerStatic<T> implements InterceptorManager<T
/** /**
* *
*/ */
private interceptors: Record<string, Interceptor<T>>; private interceptors: Record<number, Interceptor<T>>;
constructor() { constructor() {
this.id = 0; this.id = 0;
@ -38,7 +38,7 @@ export default class InterceptorManagerStatic<T> implements InterceptorManager<T
* @param rejected * @param rejected
*/ */
public use(resolved: InterceptorResolved<T>, rejected: InterceptorRejected = (err: any) => Promise.reject(err)) { public use(resolved: InterceptorResolved<T>, rejected: InterceptorRejected = (err: any) => Promise.reject(err)) {
this.interceptors[this.id++] = { this.interceptors[++this.id] = {
resolved, resolved,
rejected, rejected,
}; };

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 18:01:16 * @Date: 2020-04-13 18:01:16
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-18 15:53:05 * @LastEditTime: 2020-04-19 14:52:28
*/ */
import { AxiosRequestConfig, AxiosResponse } from '../types'; import { AxiosRequestConfig, AxiosResponse } from '../types';
import flattenHeaders from '../helper/flattenHeaders'; import flattenHeaders from '../helper/flattenHeaders';

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-15 22:09:38 * @Date: 2020-04-15 22:09:38
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-18 20:34:41 * @LastEditTime: 2020-04-19 14:47:18
*/ */
import { AxiosRequestConfig } from '../types'; import { AxiosRequestConfig } from '../types';
import adaptive from '../adapter/adaptive'; import adaptive from '../adapter/adaptive';
@ -21,10 +21,10 @@ const defaults: AxiosRequestConfig = {
head: {}, head: {},
delete: {}, delete: {},
post: { post: {
'Context-Type': 'application/x-www-form-urlencoded', 'Context-Type': 'application/x-www-form-urlencoded; charset=utf-8',
}, },
put: { put: {
'Context-Type': 'application/x-www-form-urlencoded', 'Context-Type': 'application/x-www-form-urlencoded; charset=utf-8',
}, },
}, },
validateStatus: function validateStatus(status) { validateStatus: function validateStatus(status) {

View File

@ -2,10 +2,10 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-18 12:00:01 * @Date: 2020-04-18 12:00:01
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 02:32:15 * @LastEditTime: 2020-04-19 15:20:17
*/ */
import { AliasMethod, Headers, AxiosRequestConfig } from '../types'; import { AliasMethod, Headers, AxiosRequestConfig } from '../types';
import { merge } from './utils'; import { omit } from './utils';
/** /**
* *
@ -13,14 +13,17 @@ import { merge } from './utils';
* @param config Axios * @param config Axios
*/ */
export default function flattenHeaders(config: AxiosRequestConfig): Headers { export default function flattenHeaders(config: AxiosRequestConfig): Headers {
let { headers = {} } = config; const { headers } = config;
if (headers === undefined) {
return {};
}
const method = (config.method as string).toLowerCase() as AliasMethod; const method = (config.method as string).toLowerCase() as AliasMethod;
headers = merge(headers.common ?? {}, headers[method] ?? {}, headers); return {
...(headers.common ?? {}),
['common', 'options', 'delete', 'get', 'head', 'post', 'put', 'trace', 'connect'].forEach((key: string) => { ...(headers[method] ?? {}),
delete headers[key]; ...omit(headers, 'common', 'options', 'delete', 'get', 'head', 'post', 'put', 'trace', 'connect'),
}); };
return headers;
} }

View File

@ -2,8 +2,10 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 21:55:40 * @Date: 2020-04-13 21:55:40
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 01:56:21 * @LastEditTime: 2020-04-19 16:08:40
*/ */
import { AnyObject } from '../types';
const _toString = Object.prototype.toString; const _toString = Object.prototype.toString;
/** /**
@ -44,29 +46,6 @@ export function combineURL(baseURL: string, url: string): string {
return `${baseURL.replace(/\/*$/, '')}/${url.replace(/^\/*/, '')}`; return `${baseURL.replace(/\/*$/, '')}/${url.replace(/^\/*/, '')}`;
} }
/**
*
*
* @param objs n
*/
export function merge(...objs: Record<string, any>[]): Record<string, any> {
const result: Record<string, any> = {};
function assignValue(key: string, val: any): void {
if (isPlainObject(result[key]) && isPlainObject(val)) {
result[key] = merge(result[key], val);
} else {
result[key] = val;
}
}
objs.forEach((obj: Record<string, any>): void => {
Object.entries(obj).forEach(([key, value]) => assignValue(key, value));
});
return result;
}
/** /**
* *
* *
@ -102,3 +81,31 @@ export function deepMerge(...objs: Record<string, any>[]): Record<string, any> {
return result; return result;
} }
/**
*
*
* @param obj
* @param keys key
*/
export function pick<T extends AnyObject, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
const _pick: Partial<T> = {};
keys.forEach((key: K) => (_pick[key] = obj[key]));
return _pick as Pick<T, K>;
}
/**
*
*
* @param obj
* @param keys key
*/
export function omit<T extends AnyObject, K extends keyof T>(obj: T, ...keys: K[]): Omit<T, K> {
const _omit = { ...obj };
keys.forEach((key: K) => delete _omit[key]);
return _omit;
}

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 15:23:53 * @Date: 2020-04-13 15:23:53
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 02:06:24 * @LastEditTime: 2020-04-19 14:10:56
*/ */
/** /**
* *
@ -367,16 +367,6 @@ export interface AxiosResponse<T extends Data = Data> {
*/ */
headers: Headers; headers: Headers;
/**
*
*/
response: Response;
/**
*
*/
request: RequestConfig;
/** /**
* Axios * Axios
*/ */

View File

@ -0,0 +1,48 @@
/*
* @Author: early-autumn
* @Date: 2020-04-19 14:34:13
* @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 14:40:57
*/
import buildURL from '../../src/helper/buildURL';
describe('测试 /helper/buildURL.ts', () => {
it('url', () => {
expect(buildURL('/test')).toBe('/test');
expect(buildURL('/test?id=1')).toBe('/test?id=1');
});
it('url + params', () => {
expect(
buildURL('/test', {
test: 1,
})
).toBe('/test?test=1');
expect(
buildURL('/test?id=1', {
test: 1,
})
).toBe('/test?id=1&test=1');
});
it('url + params + paramsSerializer', () => {
expect(
buildURL(
'/test',
{
test: 1,
},
() => 'paramsSerializer=ok'
)
).toBe('/test?paramsSerializer=ok');
expect(
buildURL(
'/test?id=1',
{
test: 1,
},
() => 'paramsSerializer=ok'
)
).toBe('/test?id=1&paramsSerializer=ok');
});
});

View File

@ -0,0 +1,16 @@
/*
* @Author: early-autumn
* @Date: 2020-04-19 14:43:15
* @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 16:19:24
*/
import flattenHeaders from '../../src/helper/flattenHeaders';
describe('测试 src/helper/flattenHeaders.ts', () => {
it('测试 容错', () => {
expect(flattenHeaders({})).toEqual({
Accept: 'application/json, test/plain, */*',
});
// 'Content-Type': 'application/json; charset=utf-8',
});
});

View File

@ -1,13 +0,0 @@
/*
* @Author: early-autumn
* @Date: 2020-04-14 23:43:45
* @LastEditors: early-autumn
* @LastEditTime: 2020-04-19 03:05:38
*/
import { isDate } from '../src/helper/utils';
describe('', () => {
it('?', () => {
expect(isDate(new Date())).toBe(true);
});
});