RESTful обновления ресурса гиперссылки - PullRequest
2 голосов
/ 14 марта 2012

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

Вот несколько полностью изобретенных ресурсов для 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"}
}

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

1 Ответ

1 голос
/ 15 марта 2012

В вашем ответе отсутствуют ссылки и формы, требуемые HATEOAS для систем 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
    }
}

IMO, это должно создать ресурс "аренды", который обеспечит отношения "многие ко многим" между пианино и покупателем.Затем, чтобы позволить клиенту отменить аренду, вы можете иметь форму удаления в договоре аренды.

Вот несколько хороших статей, касающихся этого:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...