Ошибка при использовании динамического/подстановочного маршрута в 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()
}

Заключение

Таким образом, вы можете разрешить конфликты маршрутизаторов. Я предлагаю вам искать подобные возможные проблемы на ранней стадии разработки, в противном случае иногда мы можем столкнуться с проблемой после запуска системы в производство, как это было у меня ранее, поскольку я не знал о подобных конфликтах. Поэтому мне пришлось потрудиться несколько часов, чтобы найти и их пофиксить😃
Надеюсь, это решение помогло вам решить проблему.

Ответить