Этот URL:
"campaign/{destination}/{partnerid}/{campaignid}/{custom}",
... для меня это не ресурс, а вызов удаленного метода. Здесь много бизнес-логики, которая может измениться в будущем. Кроме того, это сложно. Мой инстинкт инстинкта при разработке URL-адресов - проще, чем обычно Это удваивается при передаче URL-адреса внешнему партнеру.
Униформа Ресурс Локаторы должны указывать ресурсы. Пункт назначения, безусловно, является ресурсом (но об этом чуть позже), и я думаю, что вы можете считать кампанию ресурсом. Партнер - это не ресурс, которому вы служите. Custom, конечно, не является ресурсом, так как он полностью не определен.
Я слышу, что вы говорите о нежелании говорить партнерам "создать кампанию", но учтите, что в любом случае вам, вероятно, придется пойти по этому пути. Как только в кампании появятся какие-либо свойства, отличные от идентификатора партнера, вам в основном придется это сделать.
Итак, мои первые выводы заключаются в том, что вам, вероятно, следует избавиться от идентификатора партнера и извлечь его из кампании. Избавьтесь также от custom и используйте вместо этого параметры строки запроса, если это будет необходимо. Для указания способа возврата ресурса целесообразно использовать параметры строки запроса (в отличие от идентификатора ресурса).
Снятие этих урожаев:
"campaign/{destination}/{campaignid}",
Хорошо, это проще, но все равно выглядит неправильно. Что делает пункт назначения между кампанией и идентификатором кампании? Один из подходов заключается в перестановке вещей:
"campaign/{campaignid}/{destination}",
Другой вариант - использовать индексацию в стиле Astoria:
"campaign({campaignid})/{destination}",
По некоторым причинам, это выглядит странно для многих людей, но это совершенно законно. Не стесняйтесь использовать другие юридические символы, чтобы отделить кампанию от идентификатора; Дело в том, что / не является единственным выбором, и, возможно, не является подходящим выбором.
Однако ...
Один вопрос, который мы еще не рассмотрели, это то, что должно произойти, если / когда пользователь отправит действительное место назначения, но неверный идентификатор кампании или партнера. Если правильный ответ заключается в том, что пользователь должен увидеть ошибку, то все вышеперечисленное остается в силе. Если, с другой стороны, правильный ответ заключается в том, что пользователь все равно должен быть незаметно перенаправлен на целевую страницу, тогда идентификатор кампании действительно является параметром строки запроса, а не частью ресурса. Возможно, некоторым партнерам не хотелось бы получать URL-адрес со знаком вопроса, но с чисто REST-точки зрения я считаю, что это правильный подход, если действительность идентификатора кампании не определяет, где находится пользователь. В этом случае URL будет:
"campaign/{destination}",
... и вы добавите параметр строки запроса с идентификатором кампании.
Я понимаю, что не дал вам однозначного ответа на ваш вопрос. Проблема в том, что большая часть этого основана на деловых соображениях, о которых вы, вероятно, знаете, но я, конечно, нет. Поэтому я больше пытаюсь раскрыть философию REST-полного URL-адреса, чем пытаться объяснить вам свой бизнес. :)