最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

从零构建一个HTTP路由器如何建立路由器

来源:懂视网 责编:小OO 时间:2024-12-23 15:24:09
文档

从零构建一个HTTP路由器如何建立路由器

保存网址参数;知道如何匹配正则表达式组,我们将可以更新RouteEntry结构的匹配逻辑以使用它们。为此,需要将Path属性从字符串更改为Regexp类型。然后,需要更新Match方法逻辑。
推荐度:
导读保存网址参数;知道如何匹配正则表达式组,我们将可以更新RouteEntry结构的匹配逻辑以使用它们。为此,需要将Path属性从字符串更改为Regexp类型。然后,需要更新Match方法逻辑。

从零构建一个pile(`/books/(?Pd+)/(?Pd+)`,)match:=r.FindStringSubmatch("/books/123/456")ifmatch==nil{return}fmt.Println(match)//[123,456]fmt.Println(r.SubexpNames())//[AuthorID,BookID]
保存网址参数
知道如何匹配正则表达式组,我们将可以更新RouteEntry结构的匹配逻辑以使用它们。为此,需要将Path属性从字符串更改为Regexp类型。然后,需要更新Match方法逻辑。
typeRouteEntrystruct{Path*regexp.RegexpMethodstringHandlerFunchttp.HandlerFunc}func(ent*RouteEntry)Match(r*http.Request)map[string]string{match:=ent.Path.FindStringSubmatch(r.URL.Path)ifmatch==nil{returnnil}params:=make(map[string]string)groupNames:=ent.Path.SubexpNames()fori,group:=rangematch{params[groupNames[i]]=group}returnparams}
注意,上面还更改了的签名Match以返回参数映射,而非布尔值。
最后需要做的一件事是更新路由器逻辑,以在找到匹配项后将参数添加到请求上下文中。
for_,e:=rangertr.routes{params:=e.Match(r)ifparams==nil{continue}ctx:=context.WithValue(r.Context(),"params",params)e.HandlerFunc.ServeHTTP(w,r.WithContext(ctx))return}
我们在程序中添加这些部分,然后测试:
Panic恢复
添加动态URL参数极大地提高了路由器的实用性。现在可以将其在一些项目中使用。为了防止生产中发生坏事,应该增加另外一件事,那就是紧急恢复。
当前,如果路由处理程序之一出现紧急情况,服务器将返回一个空响应,而不是默认页面。将添加以下几行代码来捕获这些紧急情况并返回适当的500(内部服务器错误)状态代码。
func(rtr*Router)ServeHTTP(whttp.ResponseWriter,r*http.Request){deferfunc(){ifr:=recover();r!=nil{log.Println("ERROR:",r)http.Error(w,"发生错误…",http.StatusInternalServerError)}}()//...}
为了测试它是否有效,我们添加一条特殊的/panic路由来触发该恢复逻辑。
r.Route("GET",r*http.Request){panic("somethingbadhappened!")})
测试访问127.0.0.1:8000/panic,就会返回Uhoh!
总结
本我们实例介绍了如何使用Golang语言的标准库,从头开始构建一个路由器,当然我们构建的路由器仅仅为HTTP路由原理说明、练手和好玩,不建议在生产环境使用!在生产中使用建议使用成熟的类库,比如gorilla/mux。

文档

从零构建一个HTTP路由器如何建立路由器

保存网址参数;知道如何匹配正则表达式组,我们将可以更新RouteEntry结构的匹配逻辑以使用它们。为此,需要将Path属性从字符串更改为Regexp类型。然后,需要更新Match方法逻辑。
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top