我想获得用于OAuth目的的Authorization Bearer标头,但阅读文档看起来有点困惑
use nickel::{Nickel, JsonBody, HttpRouter, Request, Response, MiddlewareResult, MediaType};
// Get the full Authorization header from the incoming request headers
let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
Some(header) => header,
None => panic!("No authorization header found")
};
这会产生错误:
src/main.rs:84:56:84:86错误:没有为类型
hyper::header::common::authorization::Authorization<hyper::header::common::authorization::Bearer>
[E0277]实现特征hyper::header::HeaderFormat
从实现的角度来看,对我来说似乎是正确的:
https://github.com/hyperium/hyper/blob/master/src/header/common/authorization.rs
impl<S: Scheme + Any> HeaderFormat for Authorization<S> where <S as FromStr>::Err: 'static {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(scheme) = <S as Scheme>::scheme() {
try!(write!(f, "{} ", scheme))
};
self.0.fmt_scheme(f)
}
}
https://github.com/auth0/rust-api-example/issues/1
查看Authorization
的文档,我们可以看到它确实实现了Header
:
impl<S: Scheme + Any> Header for Authorization<S>
where S::Err: 'static
所以你走在了正确的轨道上。我的猜测是,你遇到了更阴险的东西:同一个板条箱的多个版本。
具体来说,我今天编译的镍版本(0.7.3)取决于hyper 0.6.16。然而,如果我将hyper = "*"
添加到我的Cargo.toml中,那么我也获得最新版本的hyper-0.7.0。
尽管看起来不直观,但hyper 0.7中的项目与hyper 0.6中的项目不兼容。这也不是关于hyper的具体内容;所有板条箱都是这样。
如果你更新了你的依赖项,锁定到镍想要的同一版本的hyper,那么你应该可以去了。
货物.toml
# ...
[dependencies]
hyper = "0.6.16"
nickel = "*"
src/main.rs
extern crate nickel;
extern crate hyper;
use hyper::header::{Authorization, Bearer};
use nickel::{HttpRouter, Request};
fn foo(request: Request) {
// Get the full Authorization header from the incoming request headers
let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
Some(header) => header,
None => panic!("No authorization header found")
};
}
fn main() {}