Как я могу заставить axios отправлять пустой массив?

Я отправляю массив целых чисел с аксиомами из приложения vue.js, метод PATCH.

Если есть значения, to data передаются, как и ожидалось.

Но если их нет (например, все элементы удалены из мультиселекта), то полезная нагрузка пуста. Мне нужно, чтобы его отправили, чтобы элементы можно было удалить из базы данных, довольно обычный вариант использования.

Мой метод обновления выглядит следующим образом:

 update({ commit, dispatch }, data) {
    return new Promise((resolve, reject) => {
      const params = {};
      params[data.name] = data.value;
      console.log(params)
      axios({ url: '/api/' + module + '/' + data.id, params, method: 'PATCH' })
        .then(response => {
          //Replace the full object in the store with the one we get back from the patch operation
          commit('update', response.data.data);
          dispatch('postUpdate', data)
          resolve(response)
        })
        .catch(err => {
          reject(err)
        })
    })

Мой console.log подтверждает, что массив params соответствует моим ожиданиям.

Object { data_items: [] }

Но сетевой запрос показывает, что он удаляется и ничего не публикуется.

Я также могу подтвердить, что когда я выбираю любые значения, запрос работает должным образом и отправляется на сервер для сохранения.

Например

Запрос заполненного выбора http:///api/processes/16?data_items[]=2

Запрос на пустое выделение — параметры запроса отсутствуют http://example.com/api/processes/16

Как я могу заставить axios отправлять пустой массив?


person charliefortune    schedule 14.03.2020    source источник
comment
По любой конкретной причине, по которой вы обертываете массив в объект, вы можете просто отправить массив сам по себе. По умолчанию Axios не будет удалять значения, если ваша полезная нагрузка соответствует вашим словам, Axios отправит ее. Можете привести пример отправленного запроса?   -  person rhys_stubbs    schedule 14.03.2020
comment
Нет особых причин для использования объекта, я, вероятно, сделал это, не подумав. Я поменял его на массив и получил тот же результат. Я добавил URL-адреса в сообщение, чтобы проиллюстрировать, что происходит, когда выбор пуст.   -  person charliefortune    schedule 15.03.2020
comment
Я должен сказать, что не понимаю, почему «data_items» является параметром запроса. Данные должны быть отделены от тела запроса. Можете ли вы предоставить скрипку для воспроизведения?   -  person rhys_stubbs    schedule 15.03.2020
comment
У меня такая же проблема. Я отправляю форму, сериализованную в объект, и если одно из значений является пустым массивом, axios по какой-то причине удаляет его из запроса.   -  person mjsarfatti    schedule 13.05.2020
comment
Я с той же проблемой. В настоящее время я сохраняю объект, у которого есть ключ со значением массива. Однако иногда этот массив может быть пустым, поскольку пользователь не может выбрать параметр. Итак, когда я отправляю этот объект с этим ключом с пустым массивом, место, которое получает запрос, получает значение null вместо пустого массива [].   -  person Kelvin Matheus    schedule 19.08.2020


Ответы (1)


Использование строки запроса querystring в качестве сериализатора и добавление пустой строки в пустой список работает для меня.

e.g.

const queryObject = {myList: myList.length > 0 ? myList : ['']}


return axios.get(url, {params: queryObject, paramsSerializer: querystring.stringify}).then(...)

Затем URL-адрес становится http://example.com?myList=, который мой сервер интерпретирует как получение пустого списка. для параметра запроса myList.

person hilipati    schedule 23.02.2021