golang http

本文介绍了如何使用Golang处理HTTP请求中的POST和GET数据。对于POST数据,可以通过http.Request.Body字段并利用json.Decoder进行解析;而对于GET数据,则可以通过URL的Query函数获取到k-v形式的参数。

golang http

  • golang 解析 POST 中的数据

POST 的数据放在 http.Request.Body 字段,可以用 json.Decoder 解析

func test(rw http.ResponseWriter, req *http.Request) {
    decoder := json.NewDecoder(req.Body)
    var t test_struct
    err := decoder.Decode(&t)
    if err != nil {
        panic(err)
    }
    defer req.Body.Close()
    log.Println(t.Test)
}
  • golang parse GET data

GET 的参数保存在 URL中, 通过Query函数返回是一个 k,v 的字典。

func test(rw http.ResponseWriter, req *http.Request) {
    fmt.Println("get itemloglist", r.URL.Query()) // map[itemid:[409990ea2ca191ce012ca19374ba0001]]
    itemId := r.URL.Query().Get("itemid")
}
### Golang HTTP 中间件的实现与使用 在构建基于 Go 的 Web 应用程序时,中间件扮演着至关重要的角色。通过中间件可以轻松地处理跨域资源共享(CORS)、身份验证、日志记录等功能。 #### 使用标准库创建简单中间件 Go 提供了一个灵活的方式来编写HTTP中间件。下面是一个简单的例子展示如何利用闭包函数作为中间件: ```go package main import ( "fmt" "net/http" ) func loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Println("Request received:", r.URL.Path) next.ServeHTTP(w, r) }) } func helloHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello Middleware")) } func main() { mux := http.NewServeMux() mux.Handle("/", loggingMiddleware(http.HandlerFunc(helloHandler))) http.ListenAndServe(":8080", mux) } ``` 此代码片段展示了怎样定义一个名为`loggingMiddleware`的日志记录器中间件[^1]。每当请求到达根路径(`"/"`)时,它会先打印访问信息再调用下一个处理器。 #### 结合第三方库Chi Router 实现更复杂的中间件链 对于更加复杂的应用场景,则推荐采用像 Chi 这样的路由库来简化开发过程并增强功能特性。以下是集成 `chi/middleware` 包的一个实例: ```go package main import ( "log" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) func main() { r := chi.NewRouter() // 添加多个内置或自定义中间件 r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Welcome to the complex middleware setup!")) }) log.Fatal(http.ListenAndServe(":3321", r)) } ``` 这里不仅引入了官方提供的错误恢复机制 (`Recoverer`) 和 请求日志 (`Logger`), 同样也可以方便地加入更多实用工具如压缩支持等[^3]. #### 自定义中间件设计模式 当面对特定业务需求时,开发者往往需要自行定制专属解决方案。此时遵循一定的设计原则有助于提高代码可维护性和扩展性。一种常见做法就是围绕责任链模式组织各个组件之间的协作关系。 例如,在处理API版本控制方面就可以这样操作: ```go type VersionedHandler struct{} func (v *VersionedHandler) ServeHTTP(w http.ResponseWriter, req *http.Request, next http.HandlerFunc){ version := req.Header.Get("X-API-Version") if version != ""{ req = req.WithContext(context.WithValue(req.Context(), "api-version", version)) } next(w,req) } ``` 上述结构体实现了接口`http.Handler`, 并重写了其唯一的方法`ServeHTTP`. 当接收到带有指定头字段的新请求时,该方法会在上下文中存储 API 版本号以便后续逻辑层获取和解析.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值