2015-03-21 9 views
3

Предположим, что я создаю API для обработки назначений. Назначение состоит из доктора, пациента и набора забот.RESTful API - Обработка вложенных отношений

Если я хочу создать встречу, какими должны быть данные POST? Обратите внимание, что с этим запросом будет создаваться только назначение. Записи врача, пациента и забот уже существуют в базе данных.

У меня есть 2 варианта:

Короткий один

{ 
    doctor_id: 8, 
    patient_id: 4, 
    cares_ids: 
    [1,7] 
} 

Чем дольше один

{ 
    doctor: { 
    id: 8, 
    name: 'Dr James Brown', 
    phone: '107-102-304', 
    address: '16th avenue' 
    }, 
    patient: { 
    id: 4, 
    name: 'Mr Elvis', 
    pathology: 'Blah Blah.' 
    }, 
    cares: 
    [ 
    { 
     id: 1, 
     name: 'Dental cares' 
    }, 
    { 
     id: 7, 
     name: 'Back pain' 
    } 
    ] 
} 

Короткий один чувствует себя чище, так как мы не посылать бесполезные данные, как имя и адрес и т. д. Но второй чувствует себя более естественным/семантическим в моем интерфейсном коде.

К примеру, в моем приложении, я бы только сделать:

appointment.doctor = selected_doctor 
// Instead of doing 
appointment.doctor_id = selected_doctor.id 

Существуют ли какие-либо RESTful лучшие практики для такого рода случай?

ответ

1

Фактически, вы столкнулись с проблемой отношений. OData обеспечивает решение этой проблемы под названием «свойства навигации». Возможно, это может дать вам некоторые намеки на решение этой проблемы. Вы можете посмотреть на эти ссылки для получения более подробной информации: http://www.odata.org/getting-started/basic-tutorial/ и http://www.odata.org/getting-started/advanced-tutorial/

На самом деле, есть несколько вопросов здесь:

  • Design представление вы хотите иметь при получении встречу
  • МОДЕЛИРОВКИ представление для создания или обновления встречи
  • Создайте представление для назначения (единичная мощность - «врач» и «пациент»)/добавьте и удалите (множественная мощность - «заботится») ссылка на встречу (например, врач)

Я думаю, что полное представление, которое вы даете в своем вопросе, соответствует тому, что вы ожидаете иметь при встрече, т. Е. Данные о назначении включают данные отношений, таких как врач, пациент и заботы.

Такие подсказки не обязательно связывать встречу с другими элементами, такими как врач и пациент. Имеются только идентификаторы. Я думаю, что у вас может быть другое представление для создания встречи. На этом уровне установки достаточно ссылки на элемент. Таким образом, вы могли бы somethinhg так:

POST /appointments 
{ 
    doctor-ref: http://.../doctors/8, 
    patient-ref: http://.../patients/4, 
    cares-ref: [ http://.../cares/1, http://.../cares/7 ] 
} 

или

POST /appointments 
{ 
    [email protected]: http://.../doctors/8, 
    [email protected]: http://.../patients/4, 
    [email protected]: [ http://.../cares/1, http://.../cares/7 ] 
} 

Таким же образом, вы можете определить дополнительные ресурсы, чтобы иметь возможность обновлять эти ссылки после назначения было создано без отправки всего содержимого ,Мы могли бы представить себе что-то вроде этого:

  • Single кардинальность

    PUT /appointments/<appointmentid>/doctor 
    { [email protected]: http://.../doctors/8 } 
    
  • Multiple мощность

    POST /appointments/<appointmentid>/cares 
    { metadata.ref: http://.../cares/8 } 
    DELETE appointments/<appointmentid>/cares 
    { metadata.ref: http://.../cares/8 } 
    

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

  • Полный

    { 
        doctor: { 
        id: 8, 
        name: 'Dr James Brown', 
        phone: '107-102-304', 
        address: '16th avenue' 
        }, 
        patient: { 
        id: 4, 
        name: 'Mr Elvis', 
        pathology: 'Blah Blah.' 
        }, 
        cares: 
        [ 
         { 
         id: 1, 
         name: 'Dental cares' 
         }, 
         { 
         id: 7, 
         name: 'Back pain' 
         } 
        ] 
    } 
    

    }

  • Parial с ссылки/ссылки

    { 
        [email protected]: http://.../doctors/8, 
        patient: { 
        id: 4, 
        name: 'Mr Elvis', 
        pathology: 'Blah Blah.' 
        }, 
        [email protected]: [ http://.../cares/1, http://.../cares/7 ] 
    } 
    

    или

    { 
        [email protected]: http://.../doctors/8, 
        patient: { 
        id: 4, 
        name: 'Mr Elvis', 
        pathology: 'Blah Blah.' 
        }, 
        cares: 
        [ 
         { 
         id: 1, 
         name: 'Dental cares' 
         }, 
         { 
         id: 7, 
         name: 'Back pain' 
         } 
        ] 
    } 
    

    }

Эта функция соответствует в OData к параметру запроса $expand.

Вы можете взглянуть на эту ссылку: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4. См. Разделы «Получение связанных объектов», «Создание отношения между объектами» и «Удаление связи между объектами». Это может дать подсказки для вашего представления.

Последняя часть вопроса связана с способом построения представления (например, для создания). Я не знаю точно, какую технологию вы используете, но на Java вы можете сделать что-то вроде этого appointment.doctor = selected_doctor и немного адаптировать сериализацию своих объектов, чтобы создать что-то вроде этого [email protected]: http://.../doctors/8 из экземпляра Doctor. Например, с Jackson2, это называется пользовательским сериализатором (см., Например, эту ссылку http://www.baeldung.com/jackson-custom-serialization).

Надеется, что это помогает вам, Тьерри

+0

Спасибо большое за подробный ответ! И жаль, что на это время ответить. Я не знал об OData, и я буду изучать его. Ура! – MonsieurNinja

Смежные вопросы