Задать вопрос
@Sashjkeee
f-e

Как объяснить бекенд-разработчику почему я не могу сделать то, что он хочет?

Вопрос я уже задавал. Но повторюсь еще раз

Есть такой кусок кода
'formData.brand'(val) {
    let payload = {
        names: arr,
        values: {
            "brand": val
        }
    }
    if (!val) return;
        axios.get('../../../json/v1/form/kasko/dependencies', {
            params: payload
        }).then(response => {
            this.$set(this.dependentData, 'brand', {
                model: response.data.models,
                country: response.data.city
            });
        }).catch(errors => {
            console.error(errors);
        });
}


в values передаю объект
На бек приходит строка; Бекер требует, чтоб ему приходил объект
5b51acdd1e1ee358756848.png

Прислал такой скрин мне
5b51aceaa1d2e624263030.png
Как ему объяснить нормально, что я не могу сделать то, что он хочет?
  • Вопрос задан
  • 1266 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 2
Учите методы запросов. При помощи GET вы отсылаете строку, чтобы отослать объект вам нужно пользоваться одним из POST, PUT, PATCH и объект отсылать параметром
https://developer.mozilla.org/uk/docs/Web/HTTP/Methods
https://learn.javascript.ru/ajax-xmlhttprequest
https://developer.mozilla.org/en-US/docs/Web/API/F...
Товй кусок кода
axios.get('../../../json/v1/form/kasko/dependencies', {
            params: payload
        }).then(response => {


Кусок кода из документации
Performing a POST request
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });


Научите бекенд писать API контракт в https://swagger.io/ тода будет меньше недопонимания
Ответ написан
Blacknife
@Blacknife
I born, raised...
1. в JS ассоциативный массив и объект - одно и то же, в PHP -нет.
2. объект в JS - это формат JSON, для PHP JSON - это строка
3. GET умеет передавать только строку, которую PHP умеет интерпретировать как массив или как массив массивов, но никаких объектов в протоколе не предусмотрено. В комментариях уже написали, что в принципе вы можете передать объект в качестве строки JSON.stringify(myObj);, но на бэке её надо снова раскодировать.

Но проблема я смотрю не в этом, на бэке судя по всему хотят получить массив а не объект как вы выразились, точно также как если бы вы отправили данные формы POSTом, а получать такую строку как на скрине с parse_str действительно извращение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
delphinpro
@delphinpro
frontend developer
Вы можете сделать так, как хочет бекэндер.
Проблема в Axios. GET-параметры, если они содержат многомерные массивы/объекты он преобразовывает в json представление, оставляя лишь линей массив верхнего уровня. В общем-то правильно (это уже отметил Владимир ), GET для запроса данных, и параметры запроса обычно идут списком.
Но всё же протокол позволяет представлять и массивы, как линейные, так и многомерные. jQuery, кстати, в этом смысле так и делает.

В общем к сути. Вы можете использовать штатные возможности Axios для трансформации параметров запроса:

let arr = [1,2,3];
let val = 'BMW';
let payload = {
    names : arr,
    values: {
        brand: val,
    },
};

axios.get('http://site.ru?id=1', {
    params: payload,
    paramsSerializer: function(params) {
        let tmp = [];
        params.names.forEach(item => {tmp.push(`names[]=${item}`)});
        for (let name in params.values) {
            if (!params.values.hasOwnProperty(name)) continue;
            tmp.push(`values[${name}]=${params.values[name]}`);
        }
        return tmp.join('&');
    },
}).then( ...


В результате запроса программист получит данные в массиве &_GET примерно в таком виде:

Array
(
    [id] => 1
    [names] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [values] => Array
        (
            [brand] => BMW
        )
)


Сериализатор придется писать под формат данных, или попробовать сообразить что-то универсальное.
Ответ написан
Комментировать
@spbislanders
Создаю свое веб приложение, девелопер
стойте, что вы делаете? вы шлете на бэкэнд:
- массив из строк, где names - query param и тип запроса GET, это ок
- в query param: values который является объектом {"brand": "bmw"}, это что такое?
вы конечно можете это сделать следующим образом:

const url = '../../../json/v1/form/kasko/dependencies?values=' 
const values = {
  "brand": val
}

axios.get(url + JSON.stringify(values))
  .then(response => {....})
  .catch(...);


как сформировать в цикле строку ?names[]=models&names[]=oiltype я думаю сами догадаетесь, ее нужно будет тоже добавить к переменной url.

если данные на создание новой строки в какой-то таблице уходят, то я бы лучше отправлял axios'ом на бэкэнд post запрос с data и content-type: application/json
чтото вроде:

data = {
   "names": [{
     "models": [{"brand" "bmw"}]
   }]
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы