#java #spring #spring-boot #rest #spring-mvc
Вопрос:
Есть сопоставление уровня класса/интерфейса и метода
@RequestMapping(value = "/post")
public interface PostApi {
//to get /posts
@RequestMapping(value = "s")
ResponseEntity getAll();
}
В принципе, я хочу добавить символ » s » в /сообщение и получить /сообщения, как это возможно
Комментарии:
1. Почему бы вам не изменить сопоставление запросов на
/posts
?@RequestMapping(value = "/posts")
2. @pleft Потому что я хочу использовать /post/{id}, а не /posts/{id}, мне не нравится этот /posts/{id} для конкретного поста.. позже при добавлении дополнительных методов
3. Предложение @pleft соответствует действительности. Рекомендуется использовать существительные во множественном числе при ссылках на коллекции, см. medium.com/@mwaysolutions/… и restfulapi.net/resource-naming
Ответ №1:
public interface PostApi {
//to get /posts
@RequestMapping(value = "/posts")
ResponseEntity getAll();
@GetMapping(value = "/post/{id}")
ResponseEntity getById(@PathParam Long id);
}
Комментарии:
1. Другого выхода нет ? Это единственный способ?
2. В вашем примере нет ничего плохого, он великолепен, но: есть ли хак для добавления «post» «s» ? Я ищу это решение, если вы меня поняли ?
3. Хорошо понял, но в чем причина такого взлома? чего вы пытаетесь достичь?
4. Я хочу иметь уровень класса «/post» и метод добавления «s».. Возможно ли это весной, потому что мне тоже нужно изменить другие методы, чтобы применить этот «ваш ответ», нужно перейти на многие методы
5. @acakojic Нет никакого взлома. Используйте множественное число во всех случаях или указывайте путь для каждого метода.
Ответ №2:
Вы не можете изменить контекстный путь, вместо этого удалите «/post», а затем используйте ниже «/post» и «/posts» для разных задач.
Комментарии:
1. Нет никакого способа добавить символ «s» при использовании метода для сопоставления уровня класса без » / » между ними, это глупо, но нормально..
2. То, что взлома нет, — это хорошо. По мере того как вы приобретете опыт написания и использования конечных точек RESTful, вы поймете дизайнерские решения, которые сейчас кажутся вам «глупыми». Одно я могу сказать вам с уверенностью: разработчики Spring Framework определенно знают, что они делают. Не судите об API по своим (неопытным) ожиданиям.
3. @Paul Я просто спрашиваю, есть ли для этого хак, потому что, когда другие разработчики входят в мой API и видят уровень класса/интерфейса, чтобы узнать, что они ищут, если вы меня понимаете, это более читабельно, чем смешивать методы. Я не осуждаю, я просто ищу решение, если оно есть :-)))
4. @acakojic Другие разработчики, использующие ваш API и читающие ваш код, будут ожидать
/posts
и не/post
будут .
Ответ №3:
вы не можете объединить значения пути в одну строку пути, так как они рассматриваются как объекты в спецификации URI, а не как несколько простых строк. (если вам нравятся RFC, проверьте это: https://datatracker.ietf.org/doc/html/rfc3986#section-3.3 )
таким образом, в основном ваше сопоставление на уровне класса уже устанавливает иерархию по дизайну, и метод может настраивать только более низкий уровень внутри этой иерархии ((более ранние) весенние документы содержали следующее объяснение: «Сопоставления на уровне метода разрешены только для сужения отображения, выраженного на уровне класса (если таковые имеются)».
единственный способ обойти это-на самом деле удалить сопоставление классов и добавить отдельные сопоставления к любому методу (как указано другими). в качестве побочного эффекта: это делает ваш код намного более читабельным, поэтому рецензентам (или вам самим через 3 месяца) не нужно сопоставлять полный путь в вашем уме, пытаясь понять контроллер