Go语言---http.request中req.URL.Path以及req.URL.Path[:]

利用go语言进行HTTP编程的过程中,我们会使用net/http包,提供了强大的HTTP客户端和服务器功能,使得编写高性能的网络应用程序变得轻而易举。Go语言也给我们提供了服务端代码,固定输出hello world:

package main

import (
	"fmt"
	"net/http"
)

func myHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "hello world")
}

// http.ListenAndServe 接收 2 个参数,第一个参数是服务启动的地址,
// 第二个参数是 Handler,任何实现了 ServeHTTP 方法的对象都可以作为 HTTP 的 Handler。
func main() {
	http.HandleFunc("/go", myHandler)

	http.ListenAndServe("127.0.0.1:8000", nil)
}

在我们的使用中Handler的使用是最为常见的

r *http.Request中,提供了很多的方法供我们使用,例如:Method,URL,Header,Body,URL.Path,URL.RawQuery,URL.Host…
最近在学习过程中,遇到了req.URL.Path,所以在这里对req.URL.Path以及req.URL.Path[:]做一个总结。

代码

package main

import (
	"fmt"
	"net/http"
)

// w 给客户端回复数据 req 读取客户端发送的数据
func HandConn(w http.ResponseWriter, req *http.Request) {
	fmt.Println("req.Method=", req.Method)
	fmt.Println("req.URL=", req.URL)
	fmt.Println("req.Header=", req.Header)
	fmt.Println("req.Body=", req.Body)
	fmt.Println("req.URL.Path=", req.URL.Path)
	fmt.Println("req.URL.Path[len(gogogo):]=", req.URL.Path[len("/gogogo/"):])
	fmt.Println("req.URL.RawQuery: ", req.URL.RawQuery)
	fmt.Println("req.URL.Host: ", req.URL.Host)

	w.Write([]byte("hello go"))
}
func main() {
	//注册处理函数,用户连接,自动调用指定的处理函数
	http.HandleFunc("/gogogo/abc/", HandConn)

	http.ListenAndServe(":8000", nil)
}

结果

在浏览器输入http://127.0.0.1:8000/gogogo/abc/以后会出现:
在这里插入图片描述
命令行会出现:
在这里插入图片描述

可以看出req.URL.Path会输出端口以后的内容/gogogo/abc/
req.URL.Path[x:]会输出端口指定x长度以后的内容,例如len(“/gogogo/”)长度以后的abc/

通过req.URL.Path以及req.URL.Path[x:]让我们在编程过程中,可以方便的获取指定的请求内容

如果你不想修改GetComponentListReq结构体ComponentTypes字段的类型为[]enum.ComponentType,但仍然想将componentTypes参数放入[]enum.ComponentType{},你可以在代码进行一些转换。 首先,你可以将获取的componentTypes字符串通过逗号分割成多个组件类型,然后使用循环将每个组件类型转换为enum.ComponentType,并添加到一个新的切片。接下来,将新切片赋值给filtering结构体的ComponentTypes字段。 以下是对代码的修改: ```go import "strings" func (c *cAsset) GetComponentList(r *ghttp.Request) { var req *v1.GetComponentListReq if err := r.Parse(&req); err != nil { r.Response.WriteJson(g.Map{ "code": 1, "msg": err.Error(), }) } // 转换componentTypes字符串为[]enum.ComponentType componentTypes := []enum.ComponentType{} if req.ComponentTypes != "" { types := strings.Split(req.ComponentTypes, ",") for _, t := range types { componentTypes = append(componentTypes, enum.ComponentType(t)) } } filtering := &creativecomponent.GetFiltering{ ComponentID: req.ComponentId, ComponentName: req.ComponentName, ComponentTypes: componentTypes, Status: []enum.ComponentStatus{}, } getRequest := &creativecomponent.GetRequest{ AdvertiserID: req.AdvertiserId, Page: req.Page, PageSize: req.PageSize, Filtering: filtering, } res, err := service.Asset().Get(getRequest) if err != nil { r.Response.WriteJson(g.Map{ "code": 2, "msg": err.Error(), }) } r.Response.WriteJson(res) } ``` 在上面的代码,我们使用`strings.Split`函数将componentTypes字符串分割为多个组件类型,并使用enum.ComponentType将每个类型转换为对应的枚举类型。然后,将转换后的类型切片赋值给filtering结构体的ComponentTypes字段,这样代码就能正常运行了。请确保在进行类型转换时,每个组件类型的值与enum.ComponentType的枚举值相匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值