Golang中Chi路由器的URL格式问题 - render.JSON参数过多

Golang中Chi路由器的URL格式问题 - render.JSON参数过多 大家好,

我是一名Python开发者,正在尝试学习Go语言。我尝试编写一个简单的REST服务器,但在编译时遇到了一些问题,我不太明白原因。代码片段如下所示。

据我所知,我遵循了 https://github.com/go-chi/chi/blob/master/middleware/url_format.go 上发布的说明。

render.JSON 的函数签名是 JSON(w http.ResponseWriter, r *http.Request, v interface{})

这肯定是一个很明显的错误,但我对Go语言还很陌生。有人能指出并解释错误在哪里吗?

感谢您的时间!

package main

import (
	"net/http"

	"github.com/gin-gonic/gin/render"
	"github.com/go-chi/chi"
	"github.com/go-chi/chi/middleware"
)

type articles struct {
	Name string `json:"name" xml:"name"`
}

func routes() http.Handler {
	r := chi.NewRouter()
	r.Use(middleware.URLFormat)

	r.Get("/articles/{id}", listArticles)

	return r
}

func listArticles(w http.ResponseWriter, r *http.Request) {
	urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string)

	switch urlFormat {
	case "json":
		render.JSON(w, r, articles{"json"})
	case "xml":
		render.XML(w, r, articles{"xml"})
	default:
		render.JSON(w, r, articles{"default"})
	}

}

func main() {
	r := chi.NewRouter()
	r.Use(middleware.Logger)

	r.Mount("/", routes())

	http.ListenAndServe(":3333", r)
}

更多关于Golang中Chi路由器的URL格式问题 - render.JSON参数过多的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

Xavier_Pegenaute:

我在编译时遇到了一些问题,

具体是什么问题?请展示给我们看。

更多关于Golang中Chi路由器的URL格式问题 - render.JSON参数过多的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,错误是由于混淆了 Gin 框架和 Chi 框架导致的。现在已经解决了。

非常感谢!

你遇到的编译错误是因为错误地导入了 github.com/gin-gonic/gin/render 包,而实际上应该使用 Chi 生态中的 github.com/go-chi/render 包。gin/render 包的 JSON 函数签名是 func JSON(w http.ResponseWriter, status int, v interface{}),它需要三个参数,而你在调用时只传了两个参数(缺少了 status 参数),这导致了编译错误。

以下是修正后的代码示例:

package main

import (
	"net/http"

	"github.com/go-chi/chi"
	"github.com/go-chi/chi/middleware"
	"github.com/go-chi/render"
)

type articles struct {
	Name string `json:"name" xml:"name"`
}

func routes() http.Handler {
	r := chi.NewRouter()
	r.Use(middleware.URLFormat)

	r.Get("/articles/{id}", listArticles)

	return r
}

func listArticles(w http.ResponseWriter, r *http.Request) {
	urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string)

	switch urlFormat {
	case "json":
		render.JSON(w, r, articles{"json"})
	case "xml":
		render.XML(w, r, articles{"xml"})
	default:
		render.JSON(w, r, articles{"default"})
	}
}

func main() {
	r := chi.NewRouter()
	r.Use(middleware.Logger)

	r.Mount("/", routes())

	http.ListenAndServe(":3333", r)
}

关键修改:

  1. github.com/gin-gonic/gin/render 替换为 github.com/go-chi/render
  2. github.com/go-chi/render 包的 JSON 函数签名是 func JSON(w http.ResponseWriter, r *http.Request, v interface{}),与你代码中的调用方式完全匹配

这样修改后,代码就能正常编译和运行了。middleware.URLFormat 中间件会根据请求的扩展名(如 /articles/123.json/articles/123.xml)自动设置上下文中的格式值,从而让 listArticles 函数能够正确响应不同格式的请求。

回到顶部