Ошибка при использовании динамического/подстановочного маршрута в GIN
Хочу предложить быстрое решение проблемы, с которой вы можете столкнуться при разработке своего API с использованием фреймворка Golang Gin
. Иногда вы можете столкнуться с такого рода проблемами неосознанно, и вам, возможно, придется потратить много часов, чтобы выяснить, в чём она заключается на самом деле.
Сценарий проблемы
Предположим, вы определили два маршрута с помощью одного и того же метода GET
.
package routes
import (
"gin-api/Controllers"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/user/jobs", Controllers.GetUserJobs())
r.GET("/user/:id", Controller.GetUserDetails())
r.Run()
}
В разных языках программирования можно обнаружить, что маршруты, упомянутые выше, не совпадают, поэтому мы не получаем конфликтов маршрутизаторов. Но при работе с Gin-Gonic
вы получите конфликт маршрутизатора, и от API вы получите ответ 404 Not Found
. В первый раз, когда столкнётесь с ним, вы можете прийти в замешательство, но, поработав некоторое время, вы привыкнете. Подстановочный знак маршрута /user/:id
конфликтует со статическим маршрутом /user/jobs
, поскольку маршрутизатор сопоставляет префиксы один за другим, а не полный маршрут сразу при работе с Gin.
Решения
Решение этого конфликта маршрутизаторов проще, чем вы, возможно, думаете. Просто разорвите цепочку совпадения префиксов.
В решении ниже мы добавили ещё один профиль префикса, который делает задания префикса и профиль разными, поэтому маршрутизатор не совпадает, соответственно, не возникает конфликта.
Проблема решается очень легко 🎉
package routes
import (
"gin-api/Controllers"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/user/jobs", Controllers.GetUserJobs())
r.GET("/user/profile/:id", Controller.GetUserDetails())
r.Run()
}
Заключение
Таким образом, вы можете разрешить конфликты маршрутизаторов. Я предлагаю вам искать подобные возможные проблемы на ранней стадии разработки, в противном случае иногда мы можем столкнуться с проблемой после запуска системы в производство, как это было у меня ранее, поскольку я не знал о подобных конфликтах. Поэтому мне пришлось потрудиться несколько часов, чтобы найти и их пофиксить😃
Надеюсь, это решение помогло вам решить проблему.