2012-03-14 3 views
2

Я разрабатываю веб-службу RESTful и пытаюсь правильно использовать гипермедиа для установления отношений между ресурсами. Для некоторых ресурсов клиент должен иметь возможность назначить связь с другим ресурсом, однако мне кажется, что требуется, чтобы клиент генерировал гиперссылку и POST/PUT/PATCH/что бы эта гиперссылка в ресурс имела некоторые недостатки (большая сложность для клиента, проблемы с безопасностью и балансировкой нагрузки и т. д.). Я думаю, что если клиент отправит простой идентификатор и будет генерировать URL-адрес сервера, будет лучше.RESTful обновления гиперссылок ресурсов

Вот некоторые полностью надуманные ресурсы для API для проката пианино, чтобы продемонстрировать мое мышление.

GET http://company.com:9999/customers/42 
{ 
    "id"  : 42, 
    "name"  : "George P. Burdell", 
    "phone"  : "555-555-5555", 
    "piano"  : { "href" : "http://company.com:9999/pianos/101"} 
} 

GET http://company.com:9999/pianos/101 
{ 
    "id"  : 101, 
    "make"  : "Steinway", 
    "model"  : "Model D" 
} 

Предположим, что клиент хочет арендовать другое фортепиано.

Клиент посылает частичное обновление, такие как:

PATCH http://company.com:9999/customers/42 
{ "piano" : 202} 

Сервер будет генерировать правильный URL для нового фортепиано ресурса и обновлять соответственно:

GET http://company.com:9999/customers/42 
{ 
    "id"  : ..., 
    "name"  : ..., 
    "phone"  : ..., 
    "piano"  : { "href" : "http://company.com:9999/pianos/202"} 
} 

Edit: Как Я вижу, клиенты, непосредственно обновляющие гиперссылки, могут быть проблематичными. Является ли это ОТЛИЧНО хорошим решением, или есть лучший? Это даже не проблема? Кроме того, реальные примеры клиентов, обновляющих гиперссылки ресурсов, были бы замечательными - я их не нашел.

+0

Мне нравится идея, она чистая и элегантная и работает до тех пор, как все лица находится в пределах тот же веб-сервис REST ... как и все API (не только RESTful), надлежащая документация является обязательной ... о чем я не говорю: что именно ваш вопрос/цель? – Yahia

+0

Спасибо, хорошая точка. Клиенты, непосредственно обновляющие гиперссылки, кажутся проблематичными, и я ищу чистое решение или кто-то, кто объяснит мне, почему это действительно не проблема. Когда я начал вводить вопрос, решение выше пришло ко мне, я решил бросить его для комментариев. – HolySamosa

ответ

1

В вашем ответе отсутствуют ссылки и формы, необходимые HATEOAS contraint систем RESTful. Например, если клиент хочет арендовать другое фортепиано, вы можете добавить форму «арендной платы» на ответ фортепиано. Например

GET http://company.com:9999/pianos/101 
{ 
    "self"  : "http://company.com:9999/pianos/101", 
    "id"  : 101, 
    "make"  : "Steinway", 
    "model"  : "Model D", 
    "rent"  : { 
     "href"  : "http://company.com:9999/pianos/101", 
     "method" : "post" 
     // you can add form parameters like from and to dates here 
    } 
} 

ИМО это должно создать «аренда» ресурс, который обеспечивал бы многие-ко-многим между фортепиано и клиентом. Затем, чтобы разрешить клиенту отменить аренду, вы можете иметь форму удаления в договоре аренды.

Вот несколько хороших статей охватывает следующее:

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