需求
之前ts-axios在处理响应结果的时候,认为HTTP status在200和300之间是一个合法值,在这个区间之外则创建一个错误。有些时候我们想自定义这个规则,比如认为304也是一个合法的状态码,所以我们希望ts-axios能提供一个配置,允许我们自定义合法状态码规则,如:
axios.get('/more/304', {
validateStatus(status) {
return status >= 200 && status < 400
}
}).then(res => {
console.log(res)
}).catch((e: AxiosError) => {
console.log(e.message)
})
通过在请求配置中配置一个validateStatus函数,它可以根据参数status来自定义合法状态码的规则。
代码实现
首先修改类型定义:
interface AxiosRequestConfig {
// ...
validateStatus?: (status: number) => boolean
}
接着修改默认配置规则:
const defaults: AxiosRequestConfig = {
// ...
validateStatus(status: number): boolean {
return status >= 200 && status < 300
},
}
修改xhr.ts
function handleResponse(response: AxiosResponse) {
if (validateStatus!(response.status)) {
resolve(response)
} else {
reject(createError(`Request failed width status code ${response.status}`, config, null, request, response))
}
}
demo
// client
axios.post('/api/extend/post',{}, {
validateStatus(status: number): boolean {
return (status >= 200 && status < 300) || status === 304
}
})
// server
router.post('/extend/post', function(req, res) {
res.status(304)
res.send('status 304')
})
可以看到,这个请求并没有报错,正常返回。