fix delete method doesn't work on AliCDN

fix #184
This commit is contained in:
Pig Fang 2020-06-18 11:45:10 +08:00
parent 46f4a1b3c5
commit 153d852f76
4 changed files with 36 additions and 26 deletions

View File

@ -109,35 +109,38 @@ export function get<T = any>(url: string, params = empty): Promise<T> {
return walkFetch(new Request(`${blessing.base_url}${url}?${qs}`, init)) return walkFetch(new Request(`${blessing.base_url}${url}?${qs}`, init))
} }
function nonGet<T = any>(method: string, url: string, data: any): Promise<T> { function nonGet<T = any>(
method: string,
url: string,
data?: FormData | object,
): Promise<T> {
emit('beforeFetch', { emit('beforeFetch', {
method: method.toUpperCase(), method: method.toUpperCase(),
url, url,
data, data,
}) })
const isFormData = data instanceof FormData
const request = new Request(`${blessing.base_url}${url}`, { const request = new Request(`${blessing.base_url}${url}`, {
body: isFormData ? data : JSON.stringify(data), body: data instanceof FormData ? data : JSON.stringify(data),
method: method.toUpperCase(), method: method.toUpperCase(),
...init, ...init,
}) })
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!(data instanceof FormData)) {
!isFormData && request.headers.set('Content-Type', 'application/json') request.headers.set('Content-Type', 'application/json')
}
return walkFetch(request) return walkFetch(request)
} }
export function post<T = any>(url: string, data = empty): Promise<T> { export function post<T = any>(url: string, data?: object): Promise<T> {
return nonGet<T>('POST', url, data) return nonGet<T>('POST', url, data)
} }
export function put<T = any>(url: string, data = empty): Promise<T> { export function put<T = any>(url: string, data?: object): Promise<T> {
return nonGet<T>('PUT', url, data) return nonGet<T>('PUT', url, data)
} }
export function del<T = any>(url: string, data = empty): Promise<T> { export function del<T = any>(url: string, data?: object): Promise<T> {
return nonGet<T>('DELETE', url, data) return nonGet<T>('DELETE', url, data)
} }

View File

@ -91,9 +91,16 @@ const Players: React.FC = () => {
return return
} }
// workaround for AliCDN, issue#184
const search = new URLSearchParams()
if (skin) {
search.append('skin', 'true')
}
if (cape) {
search.append('cape', 'true')
}
const { code, message } = await fetch.del<fetch.ResponseBody>( const { code, message } = await fetch.del<fetch.ResponseBody>(
urls.user.player.clear(selected), `${urls.user.player.clear(selected)}?${search}`,
{ type: [skin && 'skin', cape && 'cape'].filter(Boolean) },
) )
if (code === 0) { if (code === 0) {
toast.success(message) toast.success(message)

View File

@ -69,7 +69,7 @@ test('the POST method', async () => {
expect(request.headers.get('Content-Type')).toBe('application/json') expect(request.headers.get('Content-Type')).toBe('application/json')
await net.post('/abc') await net.post('/abc')
expect(window.fetch.mock.calls[2][0].body).toBe('{}') expect(window.fetch.mock.calls[2][0].body).toBeUndefined()
}) })
test('the PUT method', () => { test('the PUT method', () => {
@ -88,7 +88,7 @@ test('the PUT method', () => {
expect(stub).toBeCalledWith({ expect(stub).toBeCalledWith({
method: 'PUT', method: 'PUT',
url: '/abc', url: '/abc',
data: {}, data: undefined,
}) })
}) })
@ -108,7 +108,7 @@ test('the DELETE method', () => {
expect(stub).toBeCalledWith({ expect(stub).toBeCalledWith({
method: 'DELETE', method: 'DELETE',
url: '/abc', url: '/abc',
data: {}, data: undefined,
}) })
}) })

View File

@ -363,9 +363,9 @@ describe('reset texture', () => {
fireEvent.click(getByLabelText(t('general.cape'))) fireEvent.click(getByLabelText(t('general.cape')))
fireEvent.click(getByText(t('general.confirm'))) fireEvent.click(getByText(t('general.confirm')))
await waitFor(() => await waitFor(() =>
expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { expect(fetch.del).toBeCalledWith(
type: ['skin', 'cape'], `${urls.user.player.clear(fixture.pid)}?skin=true&cape=true`,
}), ),
) )
expect(queryByText('success')).toBeInTheDocument() expect(queryByText('success')).toBeInTheDocument()
expect(getByRole('status')).toHaveClass('alert-success') expect(getByRole('status')).toHaveClass('alert-success')
@ -383,9 +383,9 @@ describe('reset texture', () => {
fireEvent.click(getByLabelText(t('general.skin'))) fireEvent.click(getByLabelText(t('general.skin')))
fireEvent.click(getByText(t('general.confirm'))) fireEvent.click(getByText(t('general.confirm')))
await waitFor(() => await waitFor(() =>
expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { expect(fetch.del).toBeCalledWith(
type: ['skin'], `${urls.user.player.clear(fixture.pid)}?skin=true`,
}), ),
) )
expect(queryByText('success')).toBeInTheDocument() expect(queryByText('success')).toBeInTheDocument()
expect(getByRole('status')).toHaveClass('alert-success') expect(getByRole('status')).toHaveClass('alert-success')
@ -403,9 +403,9 @@ describe('reset texture', () => {
fireEvent.click(getByLabelText(t('general.cape'))) fireEvent.click(getByLabelText(t('general.cape')))
fireEvent.click(getByText(t('general.confirm'))) fireEvent.click(getByText(t('general.confirm')))
await waitFor(() => await waitFor(() =>
expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { expect(fetch.del).toBeCalledWith(
type: ['cape'], `${urls.user.player.clear(fixture.pid)}?cape=true`,
}), ),
) )
expect(queryByText('success')).toBeInTheDocument() expect(queryByText('success')).toBeInTheDocument()
expect(getByRole('status')).toHaveClass('alert-success') expect(getByRole('status')).toHaveClass('alert-success')
@ -434,9 +434,9 @@ describe('reset texture', () => {
fireEvent.click(getByLabelText(t('general.skin'))) fireEvent.click(getByLabelText(t('general.skin')))
fireEvent.click(getByText(t('general.confirm'))) fireEvent.click(getByText(t('general.confirm')))
await waitFor(() => await waitFor(() =>
expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { expect(fetch.del).toBeCalledWith(
type: ['skin'], `${urls.user.player.clear(fixture.pid)}?skin=true`,
}), ),
) )
expect(queryByText('failed')).toBeInTheDocument() expect(queryByText('failed')).toBeInTheDocument()
expect(getByRole('alert')).toHaveClass('alert-danger') expect(getByRole('alert')).toHaveClass('alert-danger')