最近用到了http这个库,占用了这么好的名字还以为是很官方的库,但是用起来很痛苦,感觉这个库的质量也不是很高,以下说说我的看法
- 莫名其妙搞个
Extension
结构出来,导致Request
没法clone,完全不知道引入Extension
有什么好处,既然是一个http库,实现了http协议之后就完事了,非要操心没有的事 - 奇怪的api命名,获取请求的uri对应的api名为
uri()
好理解,但是修改当前请求的uri叫作uri_mut
就很费解了,非要在修改uri的时候返回uri,不知道这种做法有何意义,如果改为set_uri
那么就很明确了,传入一个Uri实例替换掉自身的uri - 对请求体的处理上
body_mut
和map
这两个api功能是一模一样的,map只是修改请求体但是却使用了这么通用的命名 - 在response builder中,设置完body直接就返回一个response了而不是像上面设置header设置状态码那样返回自身,导致body只能在这个构造器的最后使用
骂了这么多主要是因为我想实现go的StripPrefix方法 https://github.com/golang/go/blob/master/src/net/http/server.go#L2021 但是一直没想好如何通过rust的http crate来实现,如果有懂行的请赐教下,我的代码见:https://github.com/xcaptain/voyager.rs/blob/master/src/http.rs#L21
用了tokio和http这2个还算比较官方的库之后,总感觉不如go的net
包简洁明了,rust社区的人似乎比较重设计模式,总是喜欢往高了抽象,效果不一定有多好但是对于初学者学习来说是非常不友好的
1
共 6 条评论, 1 页
评论区
写评论rust 世界严格区分可变性与不可变性,所以你在很多很多地方都可以看到 *_mut 这种api 命名方式。这是基本理念的体现。rust 把其他语言并未严格区分的很多细节概念明确化了,这个在很多其他语言的朋友转过来的时候严重不习惯,这实际上是开拓视野的机会。
很重要的一点就是http这个库不归官方,是第三方维护,没什么保障,你需要的是hyper和reqwest,虽然也不是官方,但质量非常高,下次选包时多看看下载量,名字正式没什么用
最后,again,
http
这个crate不是http协议的实现,仅仅是协议类型的封装以及一些helper,和go的net/http 不是同一个层面的东西。试试 reqwest?
对,就是这个库,可能是用go来写web程序的人非常多所以go的net包里的api很精简很实用,这个包下很多代码都是10年前就稳定下来了一直没动。用rust做web的少,估计tokio和http的作者们平时也很少直接操作request, response。另外我看比较有名的rocket和actix-web都自己封装了自己的http库,莫非也是因为这个http不够好用的原因?
你指的这个? http