如何在 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
    })