В этом дизайне нет ничего плохого. Но это создает длинные URL, которые иногда трудно понять, и пользователь API должен знать иерархию. Более того, потребитель API должен писать больше кода немного нестандартным способом.(Хотя это может быть сделано, но будет немного грязно).Подумайте об этом с другой точки зрения. У вас есть три ресурса, каждый из которых имеет свою индивидуальность. Поэтому, если мы проведем рефакторинг вышеуказанных URI, он будет выглядеть следующим образом (я демонстрирую только GET)
Ресурс пользователя:
Получить список пользователей
GET example.com/api/users
Получить определенного пользователя
GET example.com/api/users/{username}
Ресурс отчета:
Получить все отчеты
GET example.com/api/reports
Получить конкретный отчет
GET example.com/api/reports/{report_id}
Ресурсы для фотографий
Все фотографии
GET example.com/api/photos
Специальное фото
GET example.com/api/photos/{photo_id}
Пользователь Все отчеты
GET example.com/api/reports?username={userName}
Специальный отчет пользователя
GET example.com/api/report?username={userName}&report_id={reportId}
Пользователь Все фотографии
GET example.com/api/photos?username={userName}
Пользователь Все фотографии для идентификатора отчета (Вам может не потребоваться Имя пользователя, если идентификатор_отчета уникален независимо от пользователя,что еще больше упростит URI)
GET example.com/api/photos?username={userName}&report_id={reportId}
Все фотографии отчета
GET example.com/api/photos?report_id={reportId}
Это упрощает понимание, и с помощью этого подхода на стороне потребителя можно написать более стандартный код.