квадратные скобки в ключах параметров запроса

#javascript #get #axios #jwt

#javascript #получить #axios #jwt

Вопрос:

Мне нужно ПОЛУЧИТЬ данные из API, который использует квадратные скобки как часть имени параметра. Я не писал API, так что не стреляйте в messenger!

Редактировать: я должен был отметить, что этот код будет выполняться на узле (на стороне сервера), а не в браузере.

Я использую Axios в Javascript, и это мой вызов axios:

 axios.get(url, {params: {queryParams}})
    .then(res => {
        brands = res.data;
        console.log(res.data);
    })
    .catch(error => {
        console.log( 'nnnn')
        console.log(error);
    });
  

Параметры следующие. Для краткости я показываю три разных формата, которые я пробовал (прямой символ, экранированный и в кодировке ASCII), но при каждой попытке я передавал три параметра в одном и том же формате.

 Set the query parameters
let queryParams = {
    "tables": table,
    "manifest": manifest,
    "where[0][0]": field,
    "where[0][1]": "=",
    "where\[0\]\[2\]": searchValue,
    "ordery_by": "id, ASC",
    "limit": "100",
    "app": "json",
    'client_key': authkey
}
  

Во всех случаях axios, похоже, преобразует параметры в веб-токен javascript.

Если, с другой стороны, я объединяю параметры с URL в виде строки, запрос выполняется, и я получаю ожидаемые данные.

 let fullPath = url.concat(
    "?tables=", table,
    "amp;manifest=", manifest,
    "amp;where[0][0]=", field,
    "amp;where[0][1]=", "=",
    "amp;where[0][2]=", searchValue,
    "amp;ordery_by=", "id, ASC",
    "amp;limit=", "100",
    "amp;app=", "json",
    "amp;client_key=", authkey
)
  

Хотя у меня есть обходное решение (как показано выше), есть ли способ сделать это с помощью соответствующего объекта parameters?

Комментарии:

1. Axios не будет кодировать квадратные скобки и явно игнорируется. Есть PR, но он еще не был объединен. github.com/axios/axios/issues/3316

Ответ №1:

Если вы делаете это в браузере, вы можете использовать URLSearchParams() для итерации читаемого человеком объекта и создания строки запроса.

Для узла также доступен аналогичный модуль

axios также поддерживает передачу объекта URLSearchParams в качестве аргумента params

 let queryParams = {
    "tables": 1,
    "manifest": 2,
    "where[0][0]": 3,
    "where[0][1]": "=",
    "where[0][2]": 4,
    "ordery_by": "id,ASC",
    "limit": "100",
    "app": "json",
    'client_key': 'abc'
}

const sParams = new URLSearchParams(Object.entries(queryParams));

console.log('query string')
console.log(sParams.toString())
console.log('sParam entries')
console.log(JSON.stringify([...sParams]))  
 .as-console-wrapper {   max-height: 100%!important;top:0;}  

Сделав еще один шаг, вы можете создать полный URL-адрес с помощью конструктора URL

 const url = new URL('https://myApi.com')
url.search = new URLSearchParams(Object.entries(queryParams));

console.log(url.href)
  

Комментарии:

1. У меня не было времени попробовать эти варианты, но я сделаю это в ближайшие несколько дней. Спасибо!

2. У меня было время попробовать использовать URLSearchParams и использовать конструктор URL, и он по-прежнему не удался таким же образом. Это очень странно.

3. Axios не будет кодировать квадратные скобки и явно игнорируется. Есть PR, но он еще не был объединен. github.com/axios/axios/issues/3316