如何在 koa 应用程序中更改查询的 axios 编码?
how to change axios encoding for query in koa app?
在我的 Koa 应用程序中发送 axios 请求时,我的查询参数之一有括号,如下所示:
lastTenDays:[now-10d TO now]
.
请求如下:
const response = await this.axiosInstance.get('/somePath', {
params: {
query: query
offset: 0,
limit: 20,
count: true
}
})
当我打印 response.request 时,我注意到有一个显示请求路径的 axios 字段 _currentUrl
。在这种情况下,它看起来像这样:
https://myBaseUrl.com/somePath?query=lastTenDays:[now-10d+TO+now]&offset=0&limit=20&count=true
这就是奇怪之处。如果我像这样编码我的查询参数:lastTenDays:%5Bnow-10d+TO+now%5D
,_currentUrl
根本不会改变!
好像括号没编码的时候不编码,编码的时候按要求解码。这是怎么回事?我怎样才能防止这种情况发生,以便我可以在请求中发送编码的括号?
好吧,解决这个问题的一种 hacky 方法是 运行 decodeURI
& encodeURI
像这样 -
const oldUrl = 'https://myBaseUrl.com/somePath?query=lastTenDays:[now-10d+TO+now]&offset=0&limit=20&count=true';
const newUrl = encodeURI(decodeURI(oldUrl));
原来 axios 做了一些奇怪的事情。在此处查看他们的代码 https://github.com/axios/axios/blob/master/lib/helpers/buildURL.js#L5,您可以看到他们有一个自定义编码函数,除其他外,该函数将括号取消编码为纯文本值。
replace(/%5B/gi, '[').
replace(/%5D/gi, ']');
这就是为什么无论我将 %5B 还是 '[' 传递给端点,axios 总是将其转换为 '['。
解决方法:
可以在此处列出的请求配置中使用 paramsSerializer
指定自定义参数序列化程序:https://github.com/axios/axios#request-config.
例如,这可能看起来像:
const querystring = require('querystring')
const response = await this.axiosInstance.get('/somePath', {
params: {
query: query
offset: 0,
limit: 20,
count: true
},
paramsSerializer: querystring.stringify
})
在我的 Koa 应用程序中发送 axios 请求时,我的查询参数之一有括号,如下所示:
lastTenDays:[now-10d TO now]
.
请求如下:
const response = await this.axiosInstance.get('/somePath', {
params: {
query: query
offset: 0,
limit: 20,
count: true
}
})
当我打印 response.request 时,我注意到有一个显示请求路径的 axios 字段 _currentUrl
。在这种情况下,它看起来像这样:
https://myBaseUrl.com/somePath?query=lastTenDays:[now-10d+TO+now]&offset=0&limit=20&count=true
这就是奇怪之处。如果我像这样编码我的查询参数:lastTenDays:%5Bnow-10d+TO+now%5D
,_currentUrl
根本不会改变!
好像括号没编码的时候不编码,编码的时候按要求解码。这是怎么回事?我怎样才能防止这种情况发生,以便我可以在请求中发送编码的括号?
好吧,解决这个问题的一种 hacky 方法是 运行 decodeURI
& encodeURI
像这样 -
const oldUrl = 'https://myBaseUrl.com/somePath?query=lastTenDays:[now-10d+TO+now]&offset=0&limit=20&count=true';
const newUrl = encodeURI(decodeURI(oldUrl));
原来 axios 做了一些奇怪的事情。在此处查看他们的代码 https://github.com/axios/axios/blob/master/lib/helpers/buildURL.js#L5,您可以看到他们有一个自定义编码函数,除其他外,该函数将括号取消编码为纯文本值。
replace(/%5B/gi, '[').
replace(/%5D/gi, ']');
这就是为什么无论我将 %5B 还是 '[' 传递给端点,axios 总是将其转换为 '['。
解决方法:
可以在此处列出的请求配置中使用 paramsSerializer
指定自定义参数序列化程序:https://github.com/axios/axios#request-config.
例如,这可能看起来像:
const querystring = require('querystring')
const response = await this.axiosInstance.get('/somePath', {
params: {
query: query
offset: 0,
limit: 20,
count: true
},
paramsSerializer: querystring.stringify
})