feat: 支持 HTTP PATCH 请求

pull/41/head
zjx0905 2023-04-14 18:16:39 +08:00
parent 6550415e29
commit 22bcefcb97
13 changed files with 101 additions and 53 deletions

View File

@ -34,6 +34,7 @@ export default defineConfig({
{ text: 'HEAD 请求', link: '/basics/head' }, { text: 'HEAD 请求', link: '/basics/head' },
{ text: 'POST 请求', link: '/basics/post' }, { text: 'POST 请求', link: '/basics/post' },
{ text: 'PUT 请求', link: '/basics/put' }, { text: 'PUT 请求', link: '/basics/put' },
{ text: 'PATCH 请求', link: '/basics/patch' },
{ text: 'DELETE 请求', link: '/basics/delete' }, { text: 'DELETE 请求', link: '/basics/delete' },
{ text: 'TRACE 请求', link: '/basics/trace' }, { text: 'TRACE 请求', link: '/basics/trace' },
{ text: 'CONNECT 请求', link: '/basics/connect' }, { text: 'CONNECT 请求', link: '/basics/connect' },

View File

@ -0,0 +1,80 @@
---
title: PATCH 请求
---
# {{ $frontmatter.title }}
::: tip {{ $frontmatter.title }}
在 HTTP 协议中,请求方法 PATCH 用于对资源进行部分修改。
在 HTTP 协议中, PUT 方法已经被用来表示对资源进行整体覆盖,而 POST 方法则没有对标准的补丁格式的提供支持。不同于 PUT 方法,而与 POST 方法类似PATCH 方法是非幂等的,这就意味着连续多个相同的请求会产生不同的效果。
:::
## 普通的 `PATCH` 请求
您可以传入第一个参数 `url` 发送 `PATCH` 请求。
```ts
import axios from 'axios-miniprogram';
axios
.patch('https://api.com/test')
.then((response) => {
// 成功之后做些什么
})
.catch((error) => {
// 失败之后做些什么
});
```
## 携带数据的 `PATCH` 请求
您也可以额外传入第二个参数 `data` 发送携带数据的 `PATCH` 请求。
```ts
import axios from 'axios-miniprogram';
axios
.patch('https://api.com/test/:id', {
id: 1,
name: 'test',
})
.then((response) => {
// 成功之后做些什么
})
.catch((error) => {
// 失败之后做些什么
});
```
## 携带自定义配置的 `PATCH` 请求
您也可以额外传入第三个参数 `config` 发送携带自定义配置的 `PATCH` 请求。
```ts
import axios from 'axios-miniprogram';
axios
.patch(
'https://api.com/test/:id',
{
id: 1,
name: 'test',
},
{
headers: {
'Content-Type': 'application/json',
},
},
)
.then((response) => {
// 成功之后做些什么
})
.catch((error) => {
// 失败之后做些什么
});
```
## 兼容性
<VPCompatibility tt='2.42.0' />

View File

@ -55,7 +55,7 @@ import axios from 'axios-miniprogram';
axios axios
.put( .put(
'https://api.com/test/id', 'https://api.com/test/:id',
{ {
id: 1, id: 1,
name: 'test', name: 'test',

View File

@ -15,8 +15,7 @@
"noUnusedLocals": true, "noUnusedLocals": true,
"strictNullChecks": true, "strictNullChecks": true,
"isolatedModules": true, "isolatedModules": true,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true
"types": ["vitepress"]
}, },
"include": [ "include": [
"./.vitepress/**/*.ts", "./.vitepress/**/*.ts",

View File

@ -20,6 +20,7 @@ export type AxiosAdapterRequestMethod =
| 'HEAD' | 'HEAD'
| 'POST' | 'POST'
| 'PUT' | 'PUT'
| 'PATCH'
| 'DELETE' | 'DELETE'
| 'TRACE' | 'TRACE'
| 'CONNECT'; | 'CONNECT';
@ -61,16 +62,7 @@ export interface AxiosAdapterResponseError extends AnyObject {
/** /**
* *
*/ */
data?: { data?: AnyObject;
/**
*
*/
errMsg: string;
/**
* Errno
*/
errno: number;
};
} }
export interface AxiosAdapterRequestConfig extends AnyObject { export interface AxiosAdapterRequestConfig extends AnyObject {

View File

@ -25,6 +25,7 @@ export type AxiosRequestMethod =
| 'head' | 'head'
| 'post' | 'post'
| 'put' | 'put'
| 'patch'
| 'delete' | 'delete'
| 'trace' | 'trace'
| 'connect'; | 'connect';

View File

@ -88,7 +88,7 @@ export default class AxiosDomain {
/** /**
* *
*/ */
static asd = ['post', 'put'] as const; static asd = ['post', 'put', 'patch'] as const;
/** /**
* *
@ -125,6 +125,11 @@ export default class AxiosDomain {
*/ */
put!: AxiosDomainAsRequestWithData; put!: AxiosDomainAsRequestWithData;
/**
* patch
*/
patch!: AxiosDomainAsRequestWithData;
/** /**
* delete * delete
*/ */

View File

@ -20,6 +20,7 @@ export function flattenHeaders(
'head', 'head',
'post', 'post',
'put', 'put',
'patch',
'delete', 'delete',
'trace', 'trace',
'connect', 'connect',

View File

@ -12,6 +12,7 @@ const defaults: AxiosInstanceDefaults = {
head: {}, head: {},
post: {}, post: {},
put: {}, put: {},
patch: {},
delete: {}, delete: {},
trace: {}, trace: {},
connect: {}, connect: {},

View File

@ -18,7 +18,7 @@ describe('src/core/Axios.ts', () => {
test('应该有这些静态属性', () => { test('应该有这些静态属性', () => {
expect(Axios.as).toEqual(['options', 'trace', 'connect']); expect(Axios.as).toEqual(['options', 'trace', 'connect']);
expect(Axios.asp).toEqual(['head', 'get', 'delete']); expect(Axios.asp).toEqual(['head', 'get', 'delete']);
expect(Axios.asd).toEqual(['post', 'put']); expect(Axios.asd).toEqual(['post', 'put', 'patch']);
}); });
test('应该有这些实例属性及方法', () => { test('应该有这些实例属性及方法', () => {

View File

@ -7,7 +7,7 @@ describe('src/core/AxiosDomain.ts', () => {
test('应该有这些静态属性', () => { test('应该有这些静态属性', () => {
expect(AxiosDomain.as).toEqual(['options', 'trace', 'connect']); expect(AxiosDomain.as).toEqual(['options', 'trace', 'connect']);
expect(AxiosDomain.asp).toEqual(['head', 'get', 'delete']); expect(AxiosDomain.asp).toEqual(['head', 'get', 'delete']);
expect(AxiosDomain.asd).toEqual(['post', 'put']); expect(AxiosDomain.asd).toEqual(['post', 'put', 'patch']);
}); });
test('应该有这些实例属性', () => { test('应该有这些实例属性', () => {

View File

@ -4,40 +4,9 @@ import Axios from '@/core/Axios';
describe('src/core/flattenHeaders.ts', () => { describe('src/core/flattenHeaders.ts', () => {
const keys = [...Axios.as, ...Axios.asp, ...Axios.asd]; const keys = [...Axios.as, ...Axios.asp, ...Axios.asd];
const baseHeaders = { const baseHeaders = Object.fromEntries(
options: { keys.map((k) => [k, { v1: `${k}1`, v2: `${k}2` }]),
v1: 'options1', ) as unknown as Record<(typeof keys)[number], AnyObject>;
v2: 'options2',
},
trace: {
v1: 'trace1',
v2: 'trace2',
},
connect: {
v1: 'connect1',
v2: 'connect2',
},
head: {
v1: 'head1',
v2: 'head2',
},
get: {
v1: 'get1',
v2: 'get2',
},
delete: {
v1: 'delete1',
v2: 'delete2',
},
post: {
v1: 'post1',
v2: 'post2',
},
put: {
v1: 'put1',
v2: 'put2',
},
};
test('应该支持空配置', () => { test('应该支持空配置', () => {
expect(flattenHeaders({})).toBeUndefined(); expect(flattenHeaders({})).toBeUndefined();

View File

@ -12,9 +12,8 @@
"skipDefaultLibCheck": true, "skipDefaultLibCheck": true,
"paths": { "paths": {
"@/*": ["src/*"] "@/*": ["src/*"]
}, }
"types": ["vitest", "vitest/globals"]
}, },
"include": ["./src", "./global.d.ts", "./global.variables.d.ts"], "include": ["./src", "./test", "./global.d.ts", "./global.variables.d.ts"],
"exclude": ["node_modules", "**/*.md", "**/dist"] "exclude": ["node_modules", "**/*.md", "**/dist"]
} }