@unity_ultra_hardcore

Как вывести только entity_id в JMSSerializer вместо всей сущности?

Здравствуйте.
Появилась задача организовать тривиальное RESTful API для внутреннего пользования, подключил FOSRestBundle, но не использую его на 100% - взял только View оттуда.
Появился вопрос с де/сериализацией данных: есть у меня сущности Group (id, name) и Item с полями (id, name, group).
Сначала я делаю POST /groups с телом
{
	"name": "foo"
}

После чего GET /groups и получаю что-то вроде
[
  {
    "id": "8215471f-834b-49fa-8a32-ff4a2f849bdf",
    "name": "foo"
  }
]

Тут всё ок. Настало время сохранить Item: делаю POST /items с телом
{
	"name": "bar",
	"group": "8215471f-834b-49fa-8a32-ff4a2f849bdf"
}

Item сохраняется, иду его читать GET /items/d3e197d2-6df5-4335-9eb8-d1ee1da83fa3 и получаю
{
	"name": "bar",
	"group": {
		"id": "8215471f-834b-49fa-8a32-ff4a2f849bdf",
		"name": "foo"
	}
}

Хотя клиент ожидает увидеть ровно то, что прислал + id:
{
	"name": "bar",
	"group": "8215471f-834b-49fa-8a32-ff4a2f849bdf"
}


Вопрос: я неверно себе представляю логику работы REST или же я неверно настроил сериализатор?
Я исхожу из логики, что клиент после GET захочет взять тело ответа, модифицировать в нём одно поле (например, name) и отправить его с помощью PUT обратно, но в таком случае запрос окажется невалидным.
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ответы на вопрос 2
@bears
Все правильно у вас, вы не можете получить вот так стандартным способом:

{
"name": "bar",
"group": "8215471f-834b-49fa-8a32-ff4a2f849bdf"
}

так как у item group является связью, вот и получаете его id в виде массива/объекта.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
или же я неверно настроил сериализатор?

Именно так. Хотя я на 100% не уверен что вы организовали ресурс правильно (коль у вас там связи есть).

В целом решить вашу проблемы при сериализации поможет inline опция. К сожалению в обратную сторону оно не работает (что поделать, jms serializer не мэйнтейнится активно уже пару лет).

Альтернатива - для объекта вашего типа просто можно объявить свой хэндлер для сериализации/десериализации.
Ответ написан
Ваш ответ на вопрос

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

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