Лучшая практика отправки только обязательных полей в REST API в Symfony

Нам нужно отправить список сертификатов в другое приложение с помощью REST API. Итак, ответ объекта содержит

[
   {
      "id":1,
      "orderId":123,
      "certificateStatus":true,
      "certificateNo":"xyz123abc",
      "customer":{
         "id":36,
         "email":"[email protected]",
         "firstName":"abc",
         "lastName":"dfg",
         "user":{
            "id":23,
            "username":"[email protected]",
            "enabled":true,
            "kycStatus":false
         },
         "_links":{
            "self":{
               "href":"\/app_dev.php\/api\/v1\/customers\/36"
            }
         }
      },
      "orderItem":{
         "id":60,
         "quantity":2,
         "unitPrice":177581,
         "total":355162,
         "units":[
            {
               "id":1711,
               "adjustments":[

               ],
               "adjustmentsTotal":0
            },
            {
               "id":1712,
               "adjustments":[

               ],
               "adjustmentsTotal":0
            }
         ],
         "unitsTotal":355162,
         "adjustments":[

         ],
         "adjustmentsTotal":0,
         "variant":{
            "id":334,
            "code":"pool-gold-1oz",
            "optionValues":[

            ],
            "position":0,
            "translations":{
               "en_US":{
                  "locale":"en_US",
                  "id":334
               }
            },
            "version":2,
            "tracked":false,
            "channelPricings":{
               "UK_WEB":{
                  "channelCode":"UK_WEB",
                  "price":177582
               },
               "US_WEB":{
                  "channelCode":"US_WEB",
                  "price":177581
               }
            },
            "_links":{
               "self":{
                  "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz\/variants\/pool-gold-1oz"
               }
            }
         },
         "_links":{
            "order":{
               "href":"\/app_dev.php\/api\/v1\/orders\/29"
            },
            "product":{
               "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz"
            },
            "variant":{
               "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz\/variants\/pool-gold-1oz"
            }
         }
      }
   }
]

Я хочу, чтобы ответ JSON был примерно таким, как приведенный ниже образец ответа, для которого нужны дополнительные настраиваемые поля - код состояния и сообщение - дополнительные поля - удалить ненужные поля

    {
   "code":"custom_code_xxx",
   "message":"Successful",
   "data":[
      {
         "custom_extra_fields1":"asd",
         "custom_extra_fields2":"xyz",
         "id":1,
         "orderId":123,
         "certificateStatus":true,
         "certificateNo":"xyz123abc",
         "customer":{
            "id":36,
            "email":"[email protected]",
            "firstName":"abc",
            "lastName":"dfg",
            "user":{
               "id":23,
               "username":"[email protected]",
               "enabled":true,
               "kycStatus":false
            }
         },
         "orderItem":{
            "id":60,
            "quantity":2,
            "unitPrice":177581,
            "total":355162,
            "unitsTotal":355162
         }
      }
   ]
}

Любая лучшая практика, которую мы можем использовать для упрощения ответа JSON? или нам нужно построить массив в нужном формате


person stefun    schedule 03.07.2018    source источник
comment
любая причина для -1?   -  person stefun    schedule 04.07.2018


Ответы (2)


Когда вы используете что-то вроде, например. JMS Serializer Bundle вы можете использовать

Виртуальные свойства для дополнительных настраиваемых полей.

И Группы и/или политики исключения, чтобы избавиться от нежелательных полей.

При использовании Symfony Serializer у вас есть как минимум возможность Групп, чтобы исключить некоторые поля.

Чтобы добавить дополнительные поля, я бы либо просто использовал дополнительный геттер в вашей сущности (нет чистого подхода, но помогает), либо работал с пользовательскими нормализаторами и/или кодировщиками.

person LBA    schedule 03.07.2018
comment
Насколько я понимаю, экспозиция будет применима к полной модели. Но в моем случае мне нужно скрыть некоторые поля в одном API, которые могут потребоваться для отображения в другом API. - person stefun; 04.07.2018
comment
@stefun - так ты проверил мой другой вариант: группы? он доступен для обоих распространенных сериализаторов — какой из них вы используете? - person LBA; 10.07.2018

Стефун,

Вы должны создать новый объект передачи данных, содержащий свойства, которые вы хотите получить в качестве ответа. Затем верните этот объект как json.

Затем вы создаете класс ассемблера, который строит DTO на основе исходного объекта.

person Jeffrey Verreckt    schedule 20.08.2018