filnor
@filnor
¯\_( ツ)_/¯

Как правильно работать с REST API?

Доброй ночи.
Сейчас работаю над одинм проектом с достаточно опытным программистом и судя по всему не совсем понимаю коцепцию REST API и как с ним нужно работать.
Я пишу фронтэнд приложения на react и взаимодействую c данными через API.
Например ситуация.
У меня есть сложный обьект который мне нужно обновить или добавить. Под сложным подразумеваю примерно следующее: (это обьект написаный только что на коленке чисто для демо, в реальном у меня под 40 полей и 5 уровней вложености)
var Obj = {
  client: {
    id: "1442",
    address: {
      legal_address:{ id: "532", zip: "48202", country: "USA", street: "Apple str", house: "10", office: "25"},
      post_address: { id: "533", zip: "48202", country: "USA", street: "Apple str", house: "12", office: "25"}
   },
    stocks: [
       {
         id: "25",
         title: "Sunday Stock",
         address: { id: "532", zip: "48202", country: "USA", street: "Apple str", house: "10", office: "25"}
       },
       {
         id: "27",
         title: "Monday Stock",
         address: { id: "532", zip: "48202", country: "USA", street: "Apple str", house: "10", office: "25"}
       }
    ]
  }
}


При этом в базе это все храниться примерно так:
id         post_address    legal_address    stocks
1442       532             533              25;27


Самое главное, на сервере стоит валидация обьекта и я должен передавать туда не id, как оно хранится в базе, а полный обьект типа того который я показал выше на примере.
И самое сложное начинается когда нужно добавить новый обьект, например в массив складов.
Сейчас у меня это работает вот так:
api.newObj('stock', stockData).then( ( newStockId ) => {
       // Получаю полный обьект клиента на текущее состояние 
       api.getObj('client', id).then( ( clientObj ) => {
           // Получаю полный обьект склада что бы добавить его к массиву существующих складов
           api.getObj('stock', newStockId ).then( (newStockObj) => {
             // Добавляю к массиву складов
              var StockArray = newStockObj.stocks;
                    StockArray.push( newStockObj );
              var UpdateObj = Object.assign({}, clientObj, {stocks: StockArray});
              // Обновляю клиента
              api.updateObj('client', UpdateObj);
           });
       });
    });


Это все работает, но выглядит как-то костыльно и не совсем логично.
Но иначе, я не смогу отдать серверу валидные данные. Особенно это сложно, когда я добавляю обьект у которого внутри вложено еще 2-3 обьекта со своими id, которые так же добавляются когда приходят в запросе на добавление нового обьекта. (Например со складом, это обьект адресса который пишется в отдельную табличку).

Как делать правильно?
  • Вопрос задан
  • 1827 просмотров
Решения вопроса 2
Ну вообще днище какое-то.
Для добавления таких привязанных к объекту сущностей обычно делают PATCH/PUT запрос с урлом типа /:resource_name/:resource_id/:entity_name.
В вашем случае что-то типа PUT /clients/:id/stocks
Ответ написан
GreyCrew
@GreyCrew
Full-stack developer
Может я что то могу не так понять, но в чем проблема получить этот сложный объект с сервера со всеми полями, и его же(модифицированный) отправлять на сервер, к примеру:
const {data} = this.props
data.phones.value[position] = newValue
this.props.onSubmit(data)


т.е. получаем данные с сервера

модифицируем

и отправляем каким то методом обратно, но уже новые
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы