Я не задаю вопрос, который уже задан здесь: в чем разница между @PathParam и @QueryParam
Это вопрос «передового опыта» или соглашения.
Когда бы вы использовали @PathParam
против @QueryParam
.
То, что я могу думать о том, что решение могло бы использовать два, чтобы дифференцировать информационную структуру. Позвольте мне проиллюстрировать ниже мой LTPO - менее чем идеальное наблюдение.
Использование PathParam может быть зарезервировано для информационной категории, которая будет красиво переходить в ветку информационного дерева. PathParam может быть использован для детализации иерархии классов объектов.
Принимая во внимание, что QueryParam может быть зарезервирован для указания атрибутов для определения местоположения экземпляра класса.
Например,
/Vehicle/Car?registration=123
/House/Colonial?region=newengland
/category?instance
@GET
@Path("/employee/{dept}")
Patient getEmployee(@PathParam("dept")Long dept, @QueryParam("id")Long id) ;
против /category/instance
@GET
@Path("/employee/{dept}/{id}")
Patient getEmployee(@PathParam("dept")Long dept, @PathParam("id")Long id) ;
против ?category+instance
@GET
@Path("/employee")
Patient getEmployee(@QueryParam("dept")Long dept, @QueryParam("id")Long id) ;
Я не думаю, что есть стандартное соглашение сделать это. Здесь? Тем не менее, я хотел бы услышать о том, как люди используют PathParam против QueryParam, чтобы дифференцировать свою информацию, как я проиллюстрировал выше. Я также хотел бы услышать причину позади практики.
Ответы:
REST может не являться стандартом как таковым, но чтение общей документации по REST и публикаций в блогах должно дать вам некоторые рекомендации для хорошего способа структурирования URL-адресов API. Большинство остальных API имеют тенденцию иметь только имена ресурсов и идентификаторы ресурсов в пути. Такие как:
Некоторые API REST используют строки запросов для фильтрации, разбивки на страницы и сортировки, но поскольку REST не является строгим стандартом, я рекомендую проверить некоторые API REST, такие как github и stackoverflow, и посмотреть, что может хорошо подойти для вашего варианта использования.
Я бы порекомендовал поместить в путь все обязательные параметры, а любые необязательные параметры должны быть параметрами строки запроса. Помещение необязательных параметров в путь может привести к путанице при попытке написать обработчики URL, которые соответствуют различным комбинациям.
источник
PUT /depatments/{dept}/employees/{id}/{version}
и версия являются необязательными или версия должна бытьPUT /depatments/{dept}/employees/{id}?version=12
необязательнойPUT /depatments/{dept}/employees/{id}/versions/{version}
создать сотрудника с выбранной версией -POST /depatments/{dept}/employees/{id}/versions
создать сотрудника с версией, определенной бэкэндомВот что я делаю.
Если есть сценарий для извлечения записи на основе идентификатора, например, вам нужно получить информацию о сотруднике, чей идентификатор равен 15, тогда вы можете получить ресурс с помощью @PathParam.
Если есть сценарий, в котором вам нужно получить информацию обо всех сотрудниках, но только 10 одновременно, вы можете использовать параметр запроса
Это говорит о том, что начинающий сотрудник с идентификатором 1 получает десять записей.
Подводя итог, используйте @PathParam для поиска на основе идентификатора. Пользователь @QueryParam для фильтра или если у вас есть фиксированный список опций, которые пользователь может передать.
источник
Я думаю, что если параметр определяет конкретную сущность, вы должны использовать переменную пути. Например, чтобы получить все сообщения в моем блоге, я прошу
чтобы получить пост с id = 123, я бы попросил
но чтобы отфильтровать мой список сообщений и получить все сообщения с 1 января 2013 года, я бы попросил
В первом примере «сообщения» идентифицирует конкретную сущность (всю коллекцию сообщений в блоге). Во втором примере «123» также представляет конкретную сущность (отдельный пост в блоге). Но в последнем примере параметр «since = 2013-01-01» представляет собой запрос на фильтрацию коллекции сообщений, а не конкретной сущности. Нумерация страниц и упорядочивание были бы другим хорошим примером, то есть
Надеюсь, это поможет. :-)
источник
Я лично использовал подход «если для пользователя имеет смысл добавить в закладки URL, который включает эти параметры, тогда используйте PathParam».
Например, если URL-адрес профиля пользователя содержит некоторый параметр идентификатора профиля, поскольку пользователь может добавить его в закладки и / или отправить по электронной почте, я бы включил этот идентификатор профиля в качестве параметра пути. Кроме того, еще одним важным фактором является то, что страница, обозначенная URL-адресом, который содержит параметр пути, не изменяется - пользователь настроит свой профиль, сохранит его, а затем вряд ли сильно изменится; это означает, что веб-сканеры / поисковые системы / браузеры / и т. д. могут кешировать эту страницу в зависимости от пути.
Если параметр, переданный в URL-адресе, может изменить макет / содержимое страницы, я бы использовал это как параметр запроса. Например, если URL профиля поддерживает параметр, который указывает, показывать ли пользователю электронную почту или нет, я бы посчитал это параметром запроса. (Я знаю, что, возможно, вы могли бы сказать,
&noemail=1
что параметр или любой другой его параметр можно использовать в качестве параметра пути и генерировать 2 отдельные страницы - одну с электронным письмом на нем, одну без него - но логически это не так: остается той же страницей с определенными атрибутами или без них.Надеюсь, это поможет - я ценю, что объяснение может быть немного нечетким :)
источник
Вы можете использовать параметры запроса для фильтрации и параметры пути для группировки. Следующая ссылка содержит полезную информацию о том, когда использовать pathParams или QueryParams.
источник
Это очень интересный вопрос.
Вы можете использовать оба из них, здесь нет строгих правил, но использование переменных пути URI имеет некоторые преимущества:
Но если вы используете переменные пути, все эти сервисы могут кэшировать ваши запросы GET.
Это дает пользователю больше информации о структуре данных.
Но если ваши данные не имеют отношения иерархии, вы все равно можете использовать переменные Path, используя запятую или точку с запятой:
/ Город / долгота, широта
Как правило, используйте запятую, когда порядок параметров имеет значение, используйте точку с запятой, когда порядок не имеет значения:
/ IconGenerator / красный, синий, зеленый
Помимо этих причин, в некоторых случаях очень часто используются переменные строки запроса:
http: // www.google.com/search?q=rest
Подводя итог, нет особых причин использовать один из этих методов, но всякий раз, когда вы можете, используйте переменные URI.
источник
Как уже отмечалось, REST не является стандартом. Однако, если вы хотите реализовать стандартное соглашение URI, вы можете рассмотреть соглашение oData URI . Версия 4 была утверждена в качестве стандарта OASIS, и существуют библиотеки для oData для различных языков, включая Java, через Apache Olingo . Не позволяйте факту, что это спавн от Microsoft, оттолкнуть вас, поскольку он получил поддержку и от других игроков отрасли , включая Red Hat, Citrix, IBM, Blackberry, Drupal, Netflix Facebook и SAP
Другие усыновители перечислены здесь
источник
Из Википедии: унифицированный указатель ресурса
Путь , который содержит данные, обычно организованные в иерархической форме , которые отображаются в виде последовательности сегментов, разделенных косыми чертами.
Необязательный запрос , отделенный от предыдущей части знаком вопроса (?), Содержащий строку запроса неиерархических данных .
- В соответствии с концептуальным дизайном URL-адреса, мы могли бы реализовать PathParam для иерархических компонентов данных / директив / локаторов или реализовать QueryParam, когда данные не являются иерархическими. Это имеет смысл, поскольку пути естественным образом упорядочены, тогда как запросы содержат переменные, которые могут быть упорядочены произвольно (неупорядоченные пары переменная / значение).
Предыдущий комментатор написал:
Другой написал,
Другой,
- Тем не менее, можно реализовать гибкую неиерархическую систему для идентификации конкретных объектов! Можно иметь несколько уникальных индексов в таблице SQL и позволить идентифицировать сущности, используя любую комбинацию полей, которые составляют уникальный индекс! Различные комбинации (возможно, также упорядоченные по-разному) могут использоваться для ссылок от различных связанных объектов (источников). В этом случае мы могли бы иметь дело с неиерархическими данными, используемыми для идентификации отдельных объектов - или в других случаях, могли бы указывать только определенные переменные / поля - определенные компоненты уникальных индексов - и извлекать список / набор записей. В таких случаях может быть проще, логичнее и разумнее реализовать URL-адреса как QueryParams!
Может ли длинная шестнадцатеричная строка разбавить / уменьшить значение ключевых слов в остальной части пути? Возможно, стоит подумать о возможных последствиях SEO размещения переменных / значений в пути или в запросе.и последствия для человеческого интерфейса того, хотим ли мы, чтобы пользователи могли просматривать / исследовать иерархию URL-адресов, редактируя содержимое адресной строки. Моя страница 404 Not Found использует переменные SSI для автоматического перенаправления неработающих URL-адресов их родителям! Поисковые роботы также могут пересекать иерархию путей. С другой стороны, лично, когда я делюсь URL-адресами в социальных сетях, я вручную удаляю любые частные уникальные идентификаторы - обычно путем обрезания запроса по URL-адресу, оставляя только путь: в этом случае есть некоторая утилита для размещения уникальных идентификаторов. в пути, а не в запросе. Хотим ли мы упростить использование компонентов пути в качестве грубого пользовательского интерфейса, возможно, зависит от того, являются ли данные / компоненты удобочитаемыми или нет. Вопрос читабельности относится к вопросу об иерархии: часто данные, которые могут быть выражены как удобочитаемые ключевые слова, также являются иерархическими; в то время как иерархические данные часто могут быть выражены как удобочитаемые ключевые слова. (Сами поисковые системы могут быть определены как расширение использования URL-адресов в качестве пользовательского интерфейса.) Иерархии ключевых слов или директив могут быть не строго упорядочены, но обычно они достаточно близки, чтобы мы могли охватить альтернативные случаи в пути, ипометьте один вариант как «канонический» случай .
Есть несколько принципиальных вопросов, на которые мы можем ответить с помощью URL для каждого запроса:
Q1 почти наверняка лучше всего охватывается путем или PathParams. Q3 (который, вероятно, контролируется набором произвольно упорядоченных необязательных параметров и значений по умолчанию); почти наверняка лучше всего покрывается QueryParams. Q2: это зависит ...
источник
Вы можете поддерживать как параметры запроса, так и параметры пути, например, в случае агрегирования ресурсов - когда сбор подресурсов имеет смысл сам по себе.
Параметры запроса могут поддерживать иерархическое и неиерархическое поднаборы; Параметры пути являются только иерархическими.
Ресурсы могут демонстрировать несколько иерархий. Поддержка коротких путей, если вы будете запрашивать широкие подсемейства, которые пересекают иерархические границы.
Используйте параметры запроса для объединения ортогональных иерархий.
Используйте только параметры пути в случае композиции - когда ресурс не имеет смысла отделен от своего родителя, а глобальная коллекция всех дочерних элементов сама по себе не является полезным ресурсом.
источник
Причина на самом деле очень проста. При использовании параметра запроса вы можете использовать такие символы, как «/», и ваш клиент не должен кодировать их в формате html. Есть и другие причины, но это простой пример. Что касается того, когда использовать переменную пути. Я бы сказал, когда вы имеете дело с идентификаторами или если переменная пути является направлением для запроса.
источник
Я даю один пример, чтобы понять, когда мы используем
@Queryparam
и@pathparam
Например, я беру один ресурс это
carResource
классЕсли вы хотите, чтобы входные данные вашего метода ресурсов были обязательными, используйте тип параметра как
@pathaparam
, если входные данные вашего метода ресурса должны быть необязательными, сохраните этот тип параметра как@QueryParam
параметрДля этого ресурса передайте запрос
Если вы дадите запрос, как это, то ресурс даст основанную модель автомобиля и цвет
Если вы зададите req как этот, метод resoce покажет только автомобиль на основе быстрой модели
Если вы дадите так, мы получим исключение ResourceNotFound, потому что в классе ресурсов автомобиля я объявил carmodel, так как
@pathPram
вы должны и должны дать carmodel в качестве reQ uri, в противном случае он не передаст требование reouce, но если вы не передадите цвет также он передаст требование ресурсу почему, поскольку цвет@quetyParam
является необязательным в требовании.источник
@QueryParam
может быть удобно использован с аннотацией значения по умолчанию, так что вы можете избежать исключения нулевого указателя, если не передан параметр запроса.Когда вы хотите проанализировать параметры запроса из запроса GET, вы можете просто определить соответствующий параметр для метода, который будет обрабатывать запрос GET, и аннотировать их
@QueryParam
аннотацией.@PathParam
извлекает значения URI и соответствует@Path
. И, следовательно, получает входной параметр. 2.1@PathParam
может быть больше, чем один и установлен в аргументы методовВ приведенном выше примере
http://localhost:8080/Restr/rest/msg/{p0}/{p1}
,p0
совпадаетparam1
иp1
совпадаетparam2
. Таким образом , для URIhttp://localhost:8080/Restr/rest/msg/4/6
,мы получим результат
10
.В службе REST JAX-RS предоставляет
@QueryParam
и то, и@FormParam
другое для приема данных из HTTP-запроса. HTTP-форму можно отправить разными способами, такими как GET и POST.@QueryParam
: Принимает запрос GET и считывает данные из строки запроса.@FormParam
: Принимает запрос POST и извлекает данные из HTML-формы или любого запроса медиаисточник
В двух словах,
@Pathparam
работает для значений, проходящих через ресурсы и строку запроса/user/1
/user?id=1
@Queryparam
работает только для передачи значений Query String/user?id=1
источник