Я пытаюсь определить 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 и как?