< 返回版块

xcaptain 发表于 2019-03-15 00:15

最近用到了http这个库,占用了这么好的名字还以为是很官方的库,但是用起来很痛苦,感觉这个库的质量也不是很高,以下说说我的看法

  1. 莫名其妙搞个Extension结构出来,导致Request没法clone,完全不知道引入Extension有什么好处,既然是一个http库,实现了http协议之后就完事了,非要操心没有的事
  2. 奇怪的api命名,获取请求的uri对应的api名为uri()好理解,但是修改当前请求的uri叫作uri_mut就很费解了,非要在修改uri的时候返回uri,不知道这种做法有何意义,如果改为set_uri那么就很明确了,传入一个Uri实例替换掉自身的uri
  3. 对请求体的处理上body_mutmap这两个api功能是一模一样的,map只是修改请求体但是却使用了这么通用的命名
  4. 在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社区的人似乎比较重设计模式,总是喜欢往高了抽象,效果不一定有多好但是对于初学者学习来说是非常不友好的

评论区

写评论
Mike Tang 2019-03-15 22:02

rust 世界严格区分可变性与不可变性,所以你在很多很多地方都可以看到 *_mut 这种api 命名方式。这是基本理念的体现。rust 把其他语言并未严格区分的很多细节概念明确化了,这个在很多其他语言的朋友转过来的时候严重不习惯,这实际上是开拓视野的机会。

xxfye 2019-03-15 14:38

很重要的一点就是http这个库不归官方,是第三方维护,没什么保障,你需要的是hyper和reqwest,虽然也不是官方,但质量非常高,下次选包时多看看下载量,名字正式没什么用

kamyuentse 2019-03-15 13:49
  1. 莫名其妙搞个Extension结构出来,导致Request没法clone,完全不知道引入Extension有什么好处,既然是一个http库,实现了http协议之后就完事了,非要操心没有的事.

http 这个库严格来说没有实现http协议,它仅仅提供http协议中一些类型及其相关操作。HTTP 协议的实现请移步 hyper,至于Extensions,参考hyper的用法。

  1. 奇怪的api命名,获取请求的uri对应的api名为uri()好理解,但是修改当前请求的uri叫作uri_mut就很费解了,非要在修改uri的时候返回uri,不知道这种做法有何意义,如果改为set_uri那么就很明确了,传入一个Uri实例替换掉自身的uri

pub fn uri_mut(&self) -> &mut Uri 这种命名及返回是 rust 的一种常见实践模式,参考 https://github.com/rust-lang-nursery/api-guidelines *req.uri_mut() = a_new_uri; 这种形式个人觉得比 getter/setter 模式要好,文档中也给出了使用方法,而不是什么 “非要在修改uri的时候返回uri”,-> 返回的是一个可变引用。

  1. 对请求体的处理上body_mut和map这两个api功能是一模一样的,map只是修改请求体但是却使用了这么通用的命名

没看出来他们哪里一样了,使用场景是不一样的。写一个 combinator chain 就知道了。

  1. 在response builder中,设置完body直接就返回一个response了而不是像上面设置header设置状态码那样返回自身,导致body只能在这个构造器的最后使用

API 风格问题,如果你body 方法应该和其它保持一致,然后添加一个 build(xxx) -> xxxx来完成最后的动作,可以开issue探讨一下。

最后,again, http这个crate不是http协议的实现,仅仅是协议类型的封装以及一些helper,和go的net/http 不是同一个层面的东西。

gaxxx 2019-03-15 10:35

试试 reqwest?

作者 xcaptain 2019-03-15 08:29

对,就是这个库,可能是用go来写web程序的人非常多所以go的net包里的api很精简很实用,这个包下很多代码都是10年前就稳定下来了一直没动。用rust做web的少,估计tokio和http的作者们平时也很少直接操作request, response。另外我看比较有名的rocket和actix-web都自己封装了自己的http库,莫非也是因为这个http不够好用的原因?

Mike Tang 2019-03-15 00:23

你指的这个? http

1 共 6 条评论, 1 页