Проект пути REST для ресурсов, имеющих несколько идентификаторов - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь определить API для путей REST новой службы, где у меня есть устройства, и у каждого устройства есть текущее местоположение.

Для понимания проблемы требуется немного предыстории:

  • Речь идет о передаче текущих расположений устройств на центральный сервер
  • Обновления местоположения иногда рассчитываются на самом устройстве (GPS) и отправляются с устройства (смартфона) на сервер, но иногда также через внешнюю службу (например, систему позиционирования WiFi) и отправляются с этой системы на сервер
  • Каждое устройство имеет уникальный идентификатор, который знает смартфон. Система определения местоположения WiFi не может знать этот идентификатор, она просто знает MAC-адрес WiFi.
  • Каждое устройство имеет несколько интерфейсов для обновления местоположения (MAC-адреса)
  • Независимо от того, откуда и откуда поступают обновления местоположения интерфейса, все данные о местоположении должны быть связаны с одним и тем же уникальным идентификатором устройства

Так много для фона. Теперь о дизайне API. Как упоминалось выше, я могу получать обновления местоположения, где известен только MAC-адрес, и я могу получать обновления местоположения, где известен уникальный идентификатор устройства. В обоих случаях я могу предположить, что полученный идентификатор уникален, и теоретически я могу сказать, что mac-адрес x принадлежит устройству y. На практике это означает, что у меня есть неуникальный индекс для REST API моего местоположения:

В качестве примера рассмотрим устройство с идентификатором «123» и двумя mac-адресами «abc» и «xyz». Обычно мой путь к REST API группирует местоположения под уникальным устройством:

/devices/$id/location

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

Как, например, это будет выдвигать местоположение по уникальному идентификатору устройства со смартфона (где я знаю этот уникальный идентификатор, но НЕ знаю MAC-адрес интерфейса):

PUT /devices/123/location

И здесь внешняя система, которая знает только MAC-адрес, отправляет обновление местоположения, используя MAC-адрес в качестве ключа:

PUT /devices/abc/location
PUT /devices/xyz/location

Можно предположить, что внутренне я могу связать mac-адреса и уникальные идентификаторы устройств с одним уникальным внутренним устройством. Я могу обновить и вернуть информацию о местоположении и устройстве, используя либо MAC-адрес, либо идентификатор устройства.

Например, следующие GET-запросы, использующие либо уникальный идентификатор устройства, либо уникальный mac, вернут один и тот же объект местоположения:

GET /devices/123/location
GET /devices/abc/location
GET /devices/xyz/location

Но действительно ли это правильный дизайн REST, в котором я могу иметь несколько путей к одному и тому же ресурсу? Должен ли я скорее изменить свои пути REST и как?

1 Ответ

1 голос
/ 28 мая 2019

Может быть полезно подумать о том, как бы вы разработали веб-сайт, поддерживающий такое поведение ...

Вы можете разработать этот протокол следующим образом: клиент загружает известный URI закладки. В представлении этой страницы доступны две ссылки: одна для клиентов, которые знают mac-адрес, и другая ссылка для тех, кто знает идентификатор. Клиент выберет соответствующую ссылку для перехода. Представление, возвращаемое этим, будет формой, настроенной для конкретного варианта использования; описание формы будет указывать ожидаемые поля. Клиент заполнил бы известные поля (игнорируя любые неизвестные поля, которые предположительно имеют разумные значения по умолчанию) и отправил форму. Браузер будет использовать стандартные правила обработки для создания соответствующего HTTP-запроса к действию, указанному в форме.

В этом случае, когда нас интересует (эффективно) поиск URI ресурса, который мы хотим, основываясь на имеющейся у нас информации, мы обычно используем GET в качестве метода формы. Это отправило бы запрос на сервер, и оттуда сервер может передать (возможно, через перенаправление) соответствующий URI для использования для этого устройства.

После того, как вы получили правильный URI для использования, GET / PUT / POST / PATCH / DELETE должны работать как вы ожидаете.

это допустимый дизайн REST, в котором я могу иметь несколько путей к одному и тому же ресурсу?

Если идентификаторы разные, то ресурсы разные. Разумеется, вам разрешено иметь более одного ресурса, который выражает некоторую концепцию (или, иначе говоря, двум различным ресурсам разрешено совместно использовать одно семантическое отображение).

В вашем конкретном случае, вероятно, было бы нормально иметь ресурс для клиентов, которые знают устройство по идентификатору, и другой для клиентов, которые знают устройство по местоположению. Однако совместное использование идентификатора ресурса single для обоих случаев упрощает историю кэширования на стороне сервера.

Часть сути REST: если вы тщательно определите свои типы медиа и отношения, сервер должен иметь возможность изменять используемые стратегии кэширования, не прерывая работу клиентов (поскольку клиенты просто переходят по ссылкам и отправляют формы, предоставленные сервером ).

...